子域名部署的Laravel API仅首页可用,如何配置.htaccess?
问题分析与解决方案
你的.htaccess存在三个核心问题,导致除首页外的路由无法正常解析:
1. 规则执行顺序错误
你先定义了前端控制器规则(将非文件/目录请求转到index.php),但后续的public目录重写规则根本不会触发——[L]标志会终止当前请求的规则处理流程。正确逻辑应该是先把请求重写到public目录,再处理前端控制器的路由转发。
2. 子域名匹配规则无效
当前规则用%{HTTP_HOST} ^subdomain硬编码了子域名,而你的实际子域名是myapp.mydomain.com,这个匹配条件永远不会生效,导致public目录的重写逻辑对当前子域名完全不起作用。
3. 子域名路由重写丢失路径参数
针对子域名的规则中,RewriteRule ^(.*)$ public/ [L]没有保留请求的路径参数(即$1),所有非首页请求都会被直接转到public/,而非public/aaa或public/api/os,自然触发404错误。
修正后的.htaccess配置
RewriteEngine On # 处理子域名myapp.mydomain.com的请求重写 RewriteCond %{HTTP_HOST} ^myapp\.mydomain\.com$ RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(.*)$ /public/$1 [L] # 保留主域名的重写规则(如果需要) RewriteCond %{HTTP_HOST} ^mydomain\.com$ RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(.*)$ /public/$1 [L] # 移除非目录请求的尾部斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ $1 [L,R=301] # Laravel前端控制器:转发所有非文件/目录请求到index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
额外检查点
- 确认Nginx子域名配置的根目录指向
/mydomain_com/myapp,而非/mydomain_com/myapp/public; - 确保Laravel的
storage和bootstrap/cache目录拥有正确的读写权限。
内容的提问来源于stack exchange,提问作者nordictelecom
相关产品推荐
相关产品推荐

