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
相关产品推荐
相关产品推荐

