乐趣区

关于php:记一次奇怪的接口报错及解决

记一次解决接口报错 The GET method is not supported for this route. Supported methods: POST.的 bug;

问题体现:

服务器上部署了两套雷同代码的我的项目 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 的 POSTGET问题,能够参考
记一次 HTTP POST 申请变成 GET 申请

退出移动版