Nginx中如何阻止404 POST请求被转换为GET请求?
Nginx中如何阻止404 POST请求被转换为GET请求?
嘿,这个问题我之前踩过坑!根源在于Nginx默认处理error_page触发的内部跳转时,会把POST这类非GET请求强制转换成GET请求,所以你才会在PHP里看到$_SERVER['REQUEST_METHOD']变成GET,$_POST也空得离谱。
给你两种解决方案,选哪种看你需求:
方案一:直接修改try_files(推荐)
你现在location /块里的try_files $uri $uri/ =404;会先返回404状态码,再通过error_page跳转到index.php,这个跳转过程就是请求方法被篡改的原因。
不如直接把它改成:
location / { # First attempt to serve request as file, then # as directory, then fall back to index.php try_files $uri $uri/ /index.php; }
这样当Nginx找不到对应文件或目录时,会直接内部转发到/index.php,这种转发会完整保留原始的请求方法(包括POST),你的PHP代码就能正常拿到POST数据和正确的请求方法了。
方案二:调整error_page的写法
如果你不想改动try_files的逻辑,那可以修改error_page的语法,让它保留原始请求方法。把原来的:
error_page 404 = /index.php;
改成:
error_page 404 =404 /index.php;
这里的=404表示跳转后仍然返回404状态码,同时Nginx会把这个请求当作代理转发而非重定向,从而保留原始请求方法。如果你需要PHP页面返回200状态码,也可以改成=200 /index.php;,根据你的业务需求调整就行。
备注:内容来源于stack exchange,提问作者hanshenrik
相关产品推荐
相关产品推荐

