Laravel带后缀斜杠URL错误重定向至public路径求助
解决Laravel带后缀斜杠URL重定向到public目录的问题
这个问题的核心是根目录和public目录的.htaccess规则执行顺序导致的路径混淆。当你访问带斜杠的http://localhost/admin/page/时,请求先被根目录的规则转发到public/admin/page/,随后public目录的斜杠重定向规则用绝对路径/$1处理,导致重定向到服务器根目录下的/public/admin/page,而不是你期望的项目根路径下的/admin/page。
解决方案:调整根目录的.htaccess规则顺序
我们需要先处理尾随斜杠的重定向,再将请求转发到public目录,这样就能避免public路径暴露在URL中。修改根目录下的.htaccess为:
<IfModule mod_rewrite.c> RewriteEngine On # 重定向非目录的尾随斜杠请求到无斜杠版本 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # 将所有请求转发到public目录 RewriteRule ^(.*)$ public/$1 [L] </IfModule>
为什么这样有效?
- 当访问
http://localhost/admin/page/时,根目录的规则会先判断这不是一个实际存在的目录(!-d),然后将其重定向到http://localhost/admin/page - 重定向后的无斜杠请求再被转发到
public/admin/page,此时public目录的规则会正常处理Laravel的路由,不会再触发斜杠重定向 - 最终用户看到的URL始终是干净的
http://localhost/admin/page
注意事项
- 如果你之前测试过301重定向,浏览器可能会缓存旧的重定向规则,测试时可以使用隐私模式或者清除浏览器缓存
- 如果你需要保留public目录内的斜杠重定向逻辑,也可以将public目录中的重定向规则改为相对路径(把
/$1改成$1),但根目录先处理的方案更简洁统一
内容的提问来源于stack exchange,提问作者Simone Giusti
相关产品推荐
相关产品推荐

