迁移至SSL后$_SERVER['REQUEST_METHOD']异常及CURL调用API报错求助
解决SSL迁移后CURL调用同服务器API的301及REQUEST_METHOD异常问题
嘿,我来帮你捋清楚这个问题的来龙去脉,然后给你靠谱的解决方案~
首先咱们先拆解你遇到的两个核心问题:
- 一开始调用API返回301重定向错误
- 加了
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);后,又因为$_SERVER['REQUEST_METHOD']变了报错
为啥会出现这些问题?
- 301错误的根源:网站迁移到SSL后,服务器大概率配置了强制HTTP转HTTPS的规则(比如Apache的
.htaccess或者Nginx的重写规则),你用HTTP的URL调用自然会被重定向到HTTPS,所以返回301。 - REQUEST_METHOD变了的原因:HTTP规范里有个默认行为——当CURL跟随301/302重定向时,会把POST请求自动转换成GET请求。如果你的API接口只接受POST请求,那
$_SERVER['REQUEST_METHOD']变成GET后,接口肯定会报错。
具体怎么解决?
方案1:直接用HTTPS URL调用(最推荐,一劳永逸)
既然网站已经全量SSL了,直接把CURL的目标URL改成HTTPS的,从根源上避免301重定向:
// 把URL改成HTTPS的 $url = 'https://news.hubsdev.com/administrator/index.php?option=com_api&task=acymailing.listcreate'; $ch = curl_init($url); // 如果你原本是POST请求,保留这个配置 curl_setopt($ch, CURLOPT_POST, true); // 这里可以添加你的POST数据(如果有的话) // curl_setopt($ch, CURLOPT_POSTFIELDS, $yourPostData); // 执行请求并处理结果 $response = curl_exec($ch); curl_close($ch);
这样就不需要开启CURLOPT_FOLLOWLOCATION,自然也不会出现请求方法被转换的问题。
方案2:临时应急(不推荐长期用)
如果暂时没法修改URL,那可以在开启重定向跟随的同时,强制CURL保留原请求方法:
$url = 'http://news.hubsdev.com/administrator/index.php?option=com_api&task=acymailing.listcreate'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_POST, true); // 关键:强制使用POST方法,即使重定向也不改成GET curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); // 其他必要配置,比如POST数据、SSL验证(如果是自签名证书可能需要关闭,但生产环境别这么做) // curl_setopt($ch, CURLOPT_POSTFIELDS, $yourPostData); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch); curl_close($ch);
这个方案只是临时 workaround,长期来看还是建议直接用HTTPS URL,更符合SSL迁移后的架构。
额外要检查的点
- 看看服务器的重写规则:确认是不是真的有HTTP转HTTPS的强制规则,这是301的直接诱因。
- 验证API接口的要求:确认你的API是不是只接受POST请求,如果是,那一定要保证CURL发送的请求方法不被转换。
内容的提问来源于stack exchange,提问作者HamletHub
相关产品推荐
相关产品推荐

