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

Nginx服务在URL末尾带斜杠时无法正常工作的问题求助

解决方案:处理Nginx中PHP URL末尾斜杠的404与请求体丢失问题

这个问题我之前帮不少开发者排查过,核心有两个关键点:一是带斜杠的webservice.php/会被Nginx误判为目录导致404,二是你用的permanent重定向会丢失POST请求体(因为HTTP 301/302会把POST转为GET请求)。下面给你两个可行的解决思路:

思路1:直接让Nginx处理带斜杠的PHP文件(无需重定向)

修改Nginx中处理PHP的location块,让它能识别.php/这类路径,并正确传递请求参数和体。

找到你配置文件中的PHP处理段,把原来的正则从~ \.php$改成~ \.php(/|$),同时添加PATH_INFO的处理逻辑:

location ~ \.php(/|$) {
    fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 替换成你的PHP-FPM地址,比如127.0.0.1:9000
    fastcgi_index index.php;
    
    # 提取真实的PHP脚本名和PATH_INFO
    set $script_name $uri;
    if ($uri ~ "^(.+\.php)(/.+)") {
        set $script_name $1;
        set $path_info $2;
    }
    
    fastcgi_param SCRIPT_FILENAME $document_root$script_name;
    fastcgi_param PATH_INFO $path_info;
    include fastcgi_params;
}

这样配置后,当访问https://www.example.com/webservice.php/时,Nginx会直接把请求交给PHP-FPM处理,脚本文件还是webservice.php,同时保留请求体,不会出现404或空页面的问题。

思路2:内部重写URL(保留请求体的同时标准化地址)

如果你希望URL末尾不要带斜杠(保持美观),但又不想丢失请求体,不要用permanent(外部重定向),改用内部重写(last或break标记)。

在你的server块最上方添加这条规则(要放在PHP的location之前):

rewrite ^/(.*)/$ /$1 last;

last标记会让Nginx在内部重新处理重写后的URL,浏览器地址栏不会变化,POST请求体也会完整保留,完美解决之前重定向后空页面的问题。

注意事项

  • 修改配置后,记得重启Nginx生效:sudo systemctl restart nginx
  • 检查PHP-FPM的php.ini配置,确保cgi.fix_pathinfo设置为1(如果是较新版本PHP,可能默认是0,但上面的Nginx配置已经手动处理了PATH_INFO,所以影响不大)
  • 测试时可以用POSTMAN或curl发送带请求体的POST请求,分别测试带斜杠和不带斜杠的URL,验证响应是否正常

内容的提问来源于stack exchange,提问作者Chirag Lukhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:22:43