You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSL切换后内部API请求方法从POST变GET的问题求助

问题分析与解决方案

首先,你的问题根源很明确:当启用CURLOPT_FOLLOWLOCATION后,curl在遇到301/302重定向时,默认会把POST请求转换成GET请求——这是HTTP 1.1规范里的默认行为,但显然不符合你的API需求,导致$_SERVER['REQUEST_METHOD']变成GET,API因此失效。

下面给你两种可行的解决思路:

思路1:消除重定向(推荐)

先排查为什么会出现301跳转,从根源解决问题,这样就不需要依赖CURLOPT_FOLLOWLOCATION:

  • 检查你传入的$url是否是正确的HTTPS地址,有没有可能原本是HTTP地址被服务器强制跳转到HTTPS?确保$url直接使用https://news.hubsdev.com/...,避免HTTP→HTTPS的跳转。
  • 检查服务器配置(比如Nginx/Apache的rewrite规则),看是否存在不必要的路径重定向,比如URL中的admministrator(注意是两个m)是否是正确的路径,有没有被重定向到其他地址?

如果能消除重定向,直接去掉CURLOPT_FOLLOWLOCATION,你的POST请求就会保持原方法发送,API就能正常工作。

思路2:强制curl重定向时保持POST方法

如果必须保留重定向(比如无法修改服务器配置),可以通过curl参数强制在重定向时维持POST请求:

在你的curl代码中添加CURLOPT_POSTREDIR参数,这个参数专门控制重定向时的请求方法,适用于PHP 5.3.2及以上版本:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
// 这里把count($data)改成true更合理,只要标记是POST请求即可
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
// 添加这一行:强制301/302重定向时都使用POST方法
curl_setopt($ch, CURLOPT_POSTREDIR, 3); 
$response = curl_exec($ch);

参数说明:

CURLOPT_POSTREDIR的取值对应不同的行为:

  • 1:仅在302重定向时保持POST
  • 2:仅在301重定向时保持POST
  • 3:301和302重定向都保持POST(对应常量CURL_REDIR_POST_ALL)

另外提醒一下:CURLOPT_SSL_VERIFYPEER = false会关闭SSL证书验证,这在生产环境中是不安全的,容易遭受中间人攻击。建议在正式环境中设置为true,并通过CURLOPT_CAINFO指定正确的CA证书路径。

内容的提问来源于stack exchange,提问作者HamletHub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:20:32