表单已设method为POST,但$_SERVER['REQUEST_METHOD']返回GET
POST方法提交后REQUEST_METHOD返回GET的排查方案
常见触发原因与对应解决方式
- 中间环节的重定向把POST请求改成了GET
你代码里引用了init.php、navbar.php、foot.php三个公共文件,这类公共文件往往会写强制跳转逻辑:比如HTTP转HTTPS、未登录跳权限页、URL规范化跳转。浏览器收到301/302类跳转响应时,会默认丢弃原请求携带的POST参数,用GET方法重新请求跳转后的地址,这就是为什么明明表单设了POST,最后REQUEST_METHOD还是GET。
排查操作:打开浏览器开发者工具的「网络」面板,清空历史请求后点击表单提交,看第一笔发往index.php的请求是不是3xx状态码,如果是,顺着响应头里的跳转地址,去对应公共文件里找触发跳转的分支逻辑。 - 服务器URL重写规则误拦截POST请求
不管是Apache的.htaccess配置还是Nginx的rewrite规则,只要规则写得宽泛,把提交表单的路径匹配到了需要301跳转的规则上,就会把原本的POST请求转成GET。
排查操作:临时把站点根目录下的.htaccess文件改名后再提交表单,如果问题消失,就说明是重写规则的问题,需要给规则加POST请求的排除判断,不要对POST方法的请求做301跳转。 - DOM结构存在嵌套表单
HTML标准不允许<form>标签嵌套,浏览器遇到嵌套表单时会自动修正DOM结构,直接忽略内层表单设置的method="POST",用外层表单默认的GET方法提交所有输入元素。你当前代码里写的POST表单虽然本身没问题,但如果外层被引入的公共文件里已经提前输出了一个没有设置method的老form,就会触发这个问题。
排查操作:按F12打开元素检查面板,定位到你写的那个POST表单节点,向上翻看父级DOM结构,只要发现有其他<form>标签包裹了你的表单,就是结构问题。 - 提前输出内容触发了PHP的头信息异常
如果公共文件在PHP标签外多了多余的空格、换行、提前输出的文本,会导致PHP抛出“headers already sent”警告,部分Web环境会自动触发到当前URL的GET跳转,清空原POST请求的内容。
排查操作:临时开启PHP错误显示,提交表单看页面上是不是有对应的警告提示,顺着提示的文件和行号删掉多余的输出内容即可。
快速定位技巧:先把所有
include引入的代码全部注释,只保留最小化的表单提交逻辑测试,如果这时候POST方法能正常识别,就挨个把引入的代码加回去,加到哪段代码的时候问题复现,问题就出在那段被引入的逻辑里。
内容的提问来源于stack exchange,提问作者Adham Fayrouz
相关产品推荐
相关产品推荐

