Laravel捕获带.php后缀URL并重定向至无后缀对应URL
解决带.php后缀URL重定向到无后缀URL的方案
当然可以搞定这个问题!针对你升级Laravel后要保留原有SEO收录链接权重的需求,我推荐两种方案,优先用服务器层面的配置,因为效率更高,不用经过Laravel框架的额外处理:
方案一:服务器层面重定向(推荐)
Apache 配置(.htaccess)
如果你用的是Apache服务器,直接在Laravel项目的public/.htaccess文件中添加重定向规则,要放在Laravel默认的Rewrite规则之前:
RewriteEngine On # 添加这两条规则处理.php重定向 RewriteCond %{REQUEST_URI} ^(.*)\.php$ [NC] RewriteRule ^ %1 [R=301,L] # 下面是Laravel原有的规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
规则说明:
RewriteCond %{REQUEST_URI} ^(.*)\.php$ [NC]:匹配所有以.php结尾的请求URI,[NC]表示不区分大小写RewriteRule ^ %1 [R=301,L]:将匹配到的.php之前的部分作为新URL,返回301永久重定向(对SEO友好),[L]表示停止后续规则执行
Nginx 配置
如果是Nginx服务器,在你的站点配置文件的server块中添加以下规则:
server { # 其他配置... # 处理.php后缀的重定向 location ~* \.php$ { rewrite ^/(.*)\.php$ /$1 permanent; } # Laravel原有的路由转发规则 location / { try_files $uri $uri/ /index.php?$query_string; } }
规则说明:
~* \.php$:不区分大小写匹配所有以.php结尾的请求rewrite ^/(.*)\.php$ /$1 permanent;:去掉路径中的.php后缀,返回301永久重定向
方案二:Laravel路由层面处理
如果无法修改服务器配置,也可以在Laravel的路由中处理。在routes/web.php中添加以下路由,要放在所有其他路由的前面:
// 捕获所有带.php后缀的GET请求 Route::get('{url}.php', function ($url) { // 处理根目录的index.php,重定向到网站根路径 $redirectUrl = $url === 'index' ? '/' : "/$url"; // 返回301永久重定向 return redirect()->permanent($redirectUrl); })->where('url', '.*');
说明:
{url}.php会匹配所有形如xxx.php的路径,where('url', '.*')允许url参数包含斜杠(比如en/products.php中的en/products)redirect()->permanent()生成301重定向响应,确保搜索引擎转移权重
重要注意事项
- 必须用301永久重定向:301状态码告诉搜索引擎旧链接已经永久迁移到新链接,会把旧链接的SEO权重转移到新链接上;如果用302临时重定向,权重不会转移
- 测试重定向:可以用浏览器开发者工具的「网络」面板,查看请求的状态码是否为301,确认重定向目标正确
- 排除特殊链接:如果有个别
.php链接需要保留(比如某些遗留的动态页面),可以在规则中添加排除条件。比如Apache可以加RewriteCond %{REQUEST_URI} !^/special-page.php$ [NC],Nginx可以调整location规则,Laravel可以修改路由的where条件排除特定路径
内容的提问来源于stack exchange,提问作者Stan Barrows
相关产品推荐
相关产品推荐

