php接口报错解决分析记录
问题表现
服务器上部署了两套相同代码的项目A和B,分别以不同的域名访问,提交代码时同步更新。以POST方式请求某个特定接口时,A能够正常响应,B却无论如果都是报错The GET method is not supported for this route. Supported methods: POST.奇怪的是,本地开发是正常的,无法复现此bug, 线上服务器里A项目亦是正常访问,B项目代码与A完全相同,仅配置文件.env与域名授权文件不同。
搜索解决方法,尝试
php artisan route:clear php artisan route:cache
问题依旧,通过php artisan route:list打印出项目的所有路由,发现B项目的路由是正确的,推测问题可能与项目无关;
打开B项目的Debug设置,显示该报错的追踪路径,发现框架对该请求的Method判断为GET, 而该路由所定义方法为POST,所以直接抛出错误The GET method is not supported for this route. Supported methods: POST.问题查到这里陷入了死胡同,我无法理解为什么以POST发起的请求,流程达到框架中处理时, 请求的Method会变成GET;
纠结一天没有结果。第二天判断可能是nginx到框架过程中出的问题,尝试调取Nginx的Access日志来判断问题原因,终于发现
127.0.0.1 - - [02/Mar/2022:11:29:48 +0800] "POST /api_path/action_name HTTP/1.1" 301 162 "-" "PostmanRuntime/7.29.0"
127.0.0.1 - - [02/Mar/2022:11:29:49 +0800] "GET /api_path/action_name HTTP/1.1" 405 26147 "http://host_domain/api_path/action_name" "PostmanRuntime/7.29.0"
在Nginx这里,POST请求被301重定向成GET,以GET去请求POST的路由当然会报错;
而这个301则是宝塔环境自带的“强制HTTPS”的设置导致,开启该设置之后,nginx的配置文件会增加以下代码
#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}至此,关闭该“强制HTTS"的设置,问题解决。
后记:一般情况下301重定向强制HTTPS用于网站首页为主,网站首页一般情况下都是GET请求,自然也就不会存在POST变成GET的困扰。
关于301的POST转GET问题,可以参考
以上就是php接口报错解决分析记录的详细内容,更多关于php接口报错解决的资料请关注脚本之家其它相关文章!
相关文章
PHP使用strstr()函数获取指定字符串后所有字符的方法
这篇文章主要介绍了PHP使用strstr()函数获取指定字符串后所有字符的方法,结合实例形式较为详细的分析了PHP中strstr()函数用于字符串截取的使用技巧,需要的朋友可以参考下2016-01-01
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
这篇文章主要介绍了PHP字符串逆序排列实现方法,结合实例形式总结分析了strrev函数,二分法,循环法,递归法等常用的字符串逆序排列操作实现技巧,需要的朋友可以参考下2017-01-01
php function用法如何递归及return和echo区别
这篇文章主要介绍了php function用法如何递归及return和echo区别,需要的朋友可以参考下2014-03-03


最新评论