Laravel服务端API访问报404错误,Web端正常问题求助
解决Laravel API子目录部署的.htaccess冲突问题
问题总结
- 目录结构:
public_html/mobile/部署Laravel API项目,public_html下另有Web端代码 - 本地环境:存在
mobile/public/.htaccess时API正常工作,删除该文件后API失效 - 服务器环境:
mobile/public/.htaccess存在时Laravel无法运行;删除后能打开欢迎页,但调用API接口报404错误
核心原因
服务器环境中,上层public_html的.htaccess规则可能干扰了子目录的URL重写,或是Apache的AllowOverride配置未开启,导致Laravel的路由重写规则无法生效。
分步解决方案
1. 调整上层public_html/.htaccess规则
如果上层Web代码的.htaccess有全局重写规则,需要排除mobile目录,避免覆盖Laravel的路由规则:
# 在public_html/.htaccess的重写规则前添加以下内容 RewriteCond %{REQUEST_URI} !^/mobile/
或者添加继承规则,让子目录的.htaccess规则优先生效:
RewriteOptions inherit
2. 配置mobile目录和mobile/public目录的.htaccess
- 在
public_html/mobile/.htaccess中添加转发规则,将所有请求导向Laravel的public目录:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule>
- 恢复
mobile/public/.htaccess为Laravel默认配置(如果之前删除了):
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 处理授权头 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 移除请求尾部斜杠(非目录请求) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 所有非文件/目录请求转发到index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
3. 检查服务器Apache配置
- 确保虚拟主机配置中,
public_html目录的AllowOverride设置为All,让.htaccess规则生效:
<Directory /path/to/public_html> AllowOverride All Require all granted </Directory>
- 确认服务器已启用
mod_rewrite模块(cPanel用户可在「软件」->「Apache模块」中开启)
4. 修正Laravel环境配置
在mobile/.env文件中设置正确的项目访问地址:
APP_URL=http://你的域名/mobile
验证
完成配置后重启Apache服务,测试以下内容:
- 访问
http://你的域名/mobile应能正常打开Laravel欢迎页 - 调用API接口(如
http://你的域名/mobile/api/xxx)应正常返回数据,不再出现404错误
内容的提问来源于stack exchange,提问作者Muhammad Faiz Abdullah
相关产品推荐
相关产品推荐

