Laravel index.php与.htaccess重定向规则冲突问题求助
Laravel 9.x .htaccess规则冲突解决方案:同时实现协议/子域名重定向与隐藏index.php
核心思路
先处理协议转换(HTTP→HTTPS)、子域名重定向(www→非www、mail子域名跳转),确保完整保留请求路径与参数;再处理index.php去除重定向;最后保留Laravel默认的前端控制器转发规则,保证路由正常工作。
完整.htaccess配置
<IfModule mod_rewrite.c> RewriteEngine On # 1. 处理mail子域名重定向(示例:跳转到邮箱服务页面,可根据需求修改跳转目标) RewriteCond %{HTTP_HOST} ^mail\.myfakedomain\.com$ [NC] RewriteRule ^(.*)$ https://myfakedomain.com/mail-service/$1 [L,R=301] # 2. HTTP转HTTPS + www转非www,完整保留请求路径与查询参数 RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.myfakedomain\.com$ [NC] RewriteRule ^(.*)$ https://myfakedomain.com/$1 [L,R=301,QSA] # 3. 去除URL中的index.php,永久重定向 RewriteCond %{THE_REQUEST} /index\.php/([^\s?]+) [NC] RewriteRule ^ /%1 [L,R=301,QSA] RewriteCond %{THE_REQUEST} /index\.php\s [NC] RewriteRule ^ / [L,R=301,QSA] # 4. Laravel默认前端控制器规则(转发所有请求到index.php,隐藏index.php) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
规则说明
- mail子域名重定向:匹配
mail.myfakedomain.com开头的请求,跳转到指定路径,$1保留原请求路径,[NC]忽略大小写,[L,R=301]表示永久重定向并停止后续规则。 - HTTP转HTTPS + www转非www:通过
OR匹配两种异常情况,QSA参数确保查询字符串(如?id=1)被完整保留,$1传递原始请求路径,避免跳转后丢失URL后缀。 - 去除index.php:通过
%{THE_REQUEST}匹配用户真实发起的请求(避免内部转发规则干扰),分别处理带路径的index.php/xxx和仅index.php的两种场景,重定向到干净的URL。 - Laravel默认规则:仅当请求的文件/目录实际不存在时,才将请求转发到
index.php,既保证静态资源正常访问,又实现index.php的隐藏效果。
注意事项
- 替换所有
myfakedomain.com为你的实际域名。 - 确保服务器已开启
mod_rewrite模块。 - 测试阶段可暂时将
R=301改为R=302临时重定向,确认规则无误后再改回301永久重定向(利于SEO)。
内容的提问来源于stack exchange,提问作者Yeezus
相关产品推荐
相关产品推荐

