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重定向时保持POST2:仅在301重定向时保持POST3:301和302重定向都保持POST(对应常量CURL_REDIR_POST_ALL)
另外提醒一下:CURLOPT_SSL_VERIFYPEER = false会关闭SSL证书验证,这在生产环境中是不安全的,容易遭受中间人攻击。建议在正式环境中设置为true,并通过CURLOPT_CAINFO指定正确的CA证书路径。
内容的提问来源于stack exchange,提问作者HamletHub
相关产品推荐
相关产品推荐

