当前位置: 首页 > 后端技术 > PHP

记一个奇怪的接口报错及其解决方法

时间:2023-03-30 02:47:53 PHP

记一个接口报错的解决方法该路由不支持GET方法。支持的方法:POST。漏洞;问题表现:服务器上部署了两套相同代码的项目A和B,使用不同的域名访问,提交代码时同步更新。当以POST形式请求特定接口时,A可以正常响应,但是B无论如何都会报错。此路由不支持GET方法。支持的方法:POST。奇怪的是本地开发正常,无法复现对于这个bug,在线服务器中的项目A也能正常访问,项目B的代码和A完全一样,只是配置文件.env不同而已域名授权文件。搜索解决方案,尝试phpartisanroute:clearphpartisanroute:cache问题依旧,通过phpartisanroute:list打印出项目的所有路由,发现B项目的路由是正确的,推测是问题可能与项目无关;打开B项目Debug设置,显示错误的跟踪路径,发现框架判断请求的方法为GET,而路由定义的方法为POST,所以报错TheGETmethodisnotsupportedforthisroute.支持方式:直接抛出POST。问题在这里找到了,我已经陷入了死胡同。无法理解为什么POST发起的请求,当流程到达框架处理的时候,请求的method会变成GET;苦苦挣扎了一天,没有任何结果。第二天判断可能是nginx到框架的过程中有问题。尝试调取Nginx的访问日志判断问题原因,最后找到127.0.0.1--[02/Mar/2022:11:29:48+0800]"POST/api_path/action_nameHTTP/1.1"301162"-""PostmanRuntime/7.29.0"127.0.0.1--[02/Mar/2022:11:29:49+0800]"GET/api_path/action_nameHTTP/1.1"40526147"http://host_domain/api_path/action_name""PostmanRuntime/7.29.0"在Nginx中,POST请求被301重定向到GET,用GET请求POST当然会报错;而这个301是宝塔环境自带的“mandatoryHTTPS”设置,导致启用这个设置后在nginx配置文件中添加如下代码#HTTP_TO_HTTPS_STARTif($server_port!~443){rewrite^(/.*)$https://$host$1permanent;}至此,关闭“ForceHTTPS”设置,问题解决。后记:一般情况下,301重定向强制主要在网站首页使用HTTPS。网站首页一般都是GET请求,自然不会有POST改GET的麻烦。关于301POSTtoGET问题,可以参考RecordinganHTTPPOSTrequestintoaGETrequest