Curl - 带有 wp_remote_get() 的请求响应 500,curl_exec 响应 200

Curl - Request with wp_remote_get() responds 500, curl_exec responds 200

我的本地服务器和生产服务器 (Ubuntu 14.04.2 LTS, PHP 5.5.9-1ubuntu4.11, Apache 2.4.7) 都出现奇怪的服务器 php 卷曲错误

基本上,对远程 API returns 状态代码 500 响应的 curl 请求,仅在 wp_remote_get() 中 returns 状态 200 curl_exec() 和一个浏览器请求。

我的调试代码:

<?php
$url = 'https://yoast.com?edd_action=activate_license&license=my-license-key-here&item_name=WooCommerce+Yoast+SEO&url=https://google.com';

// this return status 200:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
echo '<pre>' . print_r($result, true) . '</pre>';

// this return status 500:
$testResp = wp_remote_get($url);
echo '<pre>' . print_r($testResp, true) . '</pre>';

我不明白为什么它对 wp_remote_get() 响应 500。我试过调整传递给 wp_remote_get() 的参数,但仍然是 500

我还在调试中禁用了所有插件。

有什么想法吗?

好的,经过一些调试,我认为问题是在 wp-includes/class-http.php 中设置的默认 User-Agent 字符串 Wordpress,在为 wp_remote_get() 创建 http 请求时设置。

该选项有一个过滤器,但默认是这样创建的:

'user-agent' => apply_filters( 'http_headers_useragent', 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) ),

所以在我的例子中,'user-agent' header 值是:"Wordpress/4.3.1; http://myurl.com"

当我挂钩到过滤器 http_headers_useragent 和 return 一个空字符串,甚至是不同的 user-agent 字符串,例如:'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/535.6.2 (KHTML, like Gecko) Version/5.2 Safari/535.6.2',请求将 return 成功的 200 响应。

不确定分号是否是真正的罪魁祸首,但如果我删除它并将 user-agent 字符串设置为 "Wordpress/4.3.1",请求也会成功。

我遇到了同样的问题 - wp_remote_get 在经典 Curl 调用进行调用时无法正常工作。确实问题出在 'user agent' 上。这是我基于 "chuuke" 发现

的解决方案
 $args = array(
            'user-agent'  =>  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/535.6.2 (KHTML, like Gecko) Version/5.2 Safari/535.6.2',
        ); 
 $data = wp_remote_get($new_url_signed,$args);

谢谢