Laravel Forge NGINX配置:移除URL中的.php后缀适配旧路由
Laravel迁移后Nginx处理旧.php URL的解决方案
1. 301重定向 vs 内部转发的选择
- 优先选301重定向:你有900个旧URL,大概率已经被搜索引擎收录、用户存了书签或者有外部链接指向这些地址。301是永久跳转,能让搜索引擎把权重转移到无.php的新路径,同时用户地址栏会自动更新为正确的无后缀URL,彻底解决重复内容问题,对SEO和用户体验都更友好。
- 内部转发仅作过渡用:如果只是临时兼容旧路径、不想让用户感知变化,可以用内部转发。但这种方式会让同一个内容同时存在带.php和不带的两个URL,容易引发SEO重复内容惩罚,除非你在Laravel页面里手动添加canonical标签指定首选地址。
2. NGINX配置修改方案
方案一:301重定向(推荐)
在location /块之前添加重定向规则,自动把所有带.php的URL跳转到去掉后缀的版本:
# 匹配带.php的URL,去掉后缀后301永久跳转 location ~ ^(.+)\.php$ { return 301 $1$is_args$args; }
原有的location ~ \.php$块可以保留,用来处理服务器上可能还存在的真实.php文件(如果有遗留);要是已经完全迁移到Laravel,也可以注释掉这个块,但建议暂时留着以防万一。
修改后的核心配置片段:
# 新增:去掉.php后缀的301重定向 location ~ ^(.+)\.php$ { return 301 $1$is_args$args; } location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log off; error_log /var/log/nginx/www.sageaudio.com-error.log error; error_page 404 /index.php; # 保留原PHP处理块(可选,完全迁移后可注释) location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; }
方案二:内部转发(无地址栏变化)
如果选择内部转发,修改location ~ \.php$块,把请求转发给Laravel处理,同时隐去.php后缀:
location ~ ^(.+)\.php$ { # 重写URI去掉.php,交给Laravel路由处理 rewrite ^(.+)\.php$ $1 last; }
这样用户访问带.php的URL时,地址栏不会变化,但实际请求会被Laravel的无后缀路由处理。需要注意的是,必须在Laravel对应的页面中添加canonical标签,比如<link rel="canonical" href="https://your-domain.com/your-path">,告诉搜索引擎哪个是首选地址,避免重复内容问题。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

