You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:30:28