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);
谢谢
我的本地服务器和生产服务器 (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);
谢谢