Я получаю нечетную ошибку php curl сервера как на локальных, так и на производственных серверах ( Ubuntu 14.04.2 LTS, PHP 5.5.9-1ubuntu4.11, Apache 2.4.7
).
В принципе, запрос curl для удаленного API возвращает ответ кода состояния 500, ТОЛЬКО в wp_remote_get()
, где он возвращает статус 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>';
Я не могу понять, почему он отвечает 500 за wp_remote_get()
. Я попытался wp_remote_get()
аргументы, переданные в wp_remote_get()
, но все же 500 с ним.
Я также отключил все плагины при отладке.
Есть идеи?
Хорошо, после небольшой отладки, я считаю, что проблема – это строка User-Agent по умолчанию, установленная WordPress в wp-includes/class-http.php
, которая задается при создании HTTP-запроса для wp_remote_get()
.
Опция имеет фильтр, но по умолчанию создается так:
'user-agent' => apply_filters( 'http_headers_useragent', 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) ),
Поэтому в моем случае значение заголовка «user-agent» было: "Wordpress/4.3.1; http://myurl.com"
Когда я подключаюсь к фильтру http_headers_useragent
и возвращает пустую строку или даже другую строку пользовательского агента, такую как: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/535.6.2 (KHTML, like Gecko) Version/5.2 Safari/535.6.2'
, запрос вернет успешный ответ 200.
Не уверен, что точка с запятой является истинным виновником, но если я удалю ее и задаю строку user-agent только "Wordpress/4.3.1"
, запрос также будет успешным.
У меня были те же проблемы – wp_remote_get не работал, а классические вызовы Curl выполняли вызовы. Действительно проблема заключается в «пользовательском агенте». Это мое решение, основанное на выводах «чукера»
$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);
благодаря