Laravel路由移除index.php:解决跳转后URL残留index.php问题
解决Laravel路由自动附加index.php的问题
我在Apache+Nginx的共享主机环境里碰过好几次一模一样的问题,核心原因是Laravel会根据当前请求的URL生成后续路由的基础路径——如果初始请求带了index.php,它就会默认把这个后缀加到所有后续路由里。再加上服务器重写规则配置不全,就会出现你遇到的情况。下面是我亲测有效的解决步骤:
1. 替换为标准的Laravel .htaccess规则
你当前的.htaccess内容不完整,直接用Laravel官方的完整规则覆盖项目public目录下的.htaccess文件:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
这个规则会帮你完成几件关键事:
- 关闭MultiViews避免路由冲突
- 自动去除URL末尾的冗余斜杠
- 将所有非文件/文件夹的请求转发到
index.php,同时不在URL中显示它
2. 修正.env中的APP_URL配置
打开项目根目录的.env文件,找到APP_URL行,设置为你的纯净域名,绝对不要带index.php:
APP_URL=https://www.example.com
Laravel会依赖这个值生成路由的基础URL,只要这里是干净的域名,后续路由就会默认使用正确的路径,不会附加index.php。
3. 清除Laravel缓存
旧的路由缓存或配置缓存可能保留了错误的URL生成规则,执行以下命令清除缓存(如果共享主机有SSH权限直接在终端执行;没有权限的话,可以手动删除bootstrap/cache目录下的所有文件):
php artisan cache:clear php artisan config:clear php artisan route:clear
4. 确认Nginx反向代理配置(可选)
因为是Apache+Nginx架构,Nginx负责接收请求后反向代理到Apache,如果你有权限修改Nginx配置,要确保:
- Nginx将所有请求正确转发到项目的
public目录 - 没有额外的
index.php附加逻辑
如果是共享主机,你可以联系主机商确认这部分配置是否正确。
完成以上步骤后,再访问www.example.com/index.php并点击其他路由,就能看到URL自动变为www.example.com/ROUTE_NAME,不会再携带index.php了。
内容的提问来源于stack exchange,提问作者Emad
相关产品推荐
相关产品推荐

