Laravel移除URL中/index.php/并强制HTTPS及404错误问题求助
问题根因
你遇到的两个故障均由重写规则执行顺序错误导致:
- 原配置把HTTPS跳转规则放在了入口转发规则之后,入口转发标记了
[L](终止当前轮次重写),因此HTTP请求永远不会走到HTTPS跳转逻辑 - 直接添加移除
index.php/的规则没有加请求来源判断,会和内部转发逻辑冲突,导致重定向循环或404
正确配置方案
将public/.htaccess内容替换为以下配置即可:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 1. 优先强制HTTPS跳转 RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 2. 移除URL中的/index.php/前缀(匹配实际用户请求,避免内部重写冲突) RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php/([^\ ]*)\ HTTP/ RewriteRule ^index.php/(.*) /$1 [R=301,L] # 3. 处理Authorization头 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 4. 非目录的请求移除尾部斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 5. 内部转发所有非静态资源请求到index.php(不会暴露到地址栏) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [L] </IfModule>
生效注意事项
修改完成后需要清空浏览器缓存,301永久重定向会被浏览器长期缓存,旧的错误规则缓存会导致配置看起来不生效。
内容的提问来源于stack exchange,提问作者Lien Lien
相关产品推荐
相关产品推荐

