PHP Curl — 400 неверный запрос

#php #curl

#php #curl

Вопрос:

Я знаю, что это распространенная проблема при использовании Curl, но я не нашел решения после просмотра StackOverflow и Google.

Я пробовал разные пользовательские агенты и получаю разные ошибки:

  • Запрошенный URL вернул ошибку: 400 неверных запросов типа Requestresource(19) (неизвестно)
  • Запрошенный URL вернул ошибку: 400 Неверная строка запроса (42) типа (неизвестно) (я заметил, что 42 ссылается на ‘=’ в $ target_url)

в зависимости от некоторых изменений, которые я вношу в свой приведенный ниже код, однако ни одно из них не указало мне направление для решения этой проблемы.

Я ценю любой совет:

 $target_url = "http://www.hockeydb.com/ihdb/stats/pdisplay.php?pid=170307";

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)');
    curl_setopt($ch, CURLOPT_URL,$target_url);
    curl_setopt($ch, CURLOPT_FAILONERROR, true);
    //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $html = curl_exec($ch);
    if ($html === false) $html = curl_error($ch);
    echo stripslashes($html);
    curl_close($ch);

    var_dump($ch);
  

*** Я должен отметить, что я фактически считываю URL (и несколько других) из файла, так что, возможно, что-то не так с форматом URL?
Я делал это раньше, и у меня не было с этим проблем, но теперь я в тупике.
Я читаю каждую строку / URL и помещаю ее в массив, который я просматриваю позже.

*** Если я жестко закодирую URL, то он будет работать нормально, но по какой-то причине чтение его из файла приводит к ошибке.

Комментарии:

1. Мы мало что можем предложить здесь в качестве помощи. Вы должны сравнить рабочий запрос (возможно, выполненный с помощью какого-либо браузера) с отправленным вами запросом. Для этого лучше всего использовать сетевой анализатор, чтобы у вас было одинаковое отображение для обоих запросов. wireshark является простым в использовании.

2. странно, я попробовал ваш код в изолированной среде, и он сработал

3. в любом случае попробуйте включить заголовки Accept (кодировка и язык)

4. Я также пробовал это в изолированной среде, и это сработало, однако это не сработает при загрузке на мой сервер. Я добавил примечание выше, что я считываю URL-адрес из файла *.txt.

Ответ №1:

Не используйте stripslashes() use preg_replace() для фильтрации URL-адресов

 <?php
$target_url="http://www.hockeydb.com/ihdb/stats/pdisplay.php?pid=170307";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,4); 
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

$html = curl_exec($ch);

$html = preg_replace("#(<s*as [^>]*hrefs*=s*["'])(?!http)([^"'>] )  (["'>] )#",'$1'.$target_url.'$2$3', $html);
echo $html;

curl_close($ch);
var_dump($ch);
?>
  

Комментарии:

1. Функция ‘stripslashes()’ (или preg_replace()) существует только для целей отладки. Однако $ html возвращается как ‘false’.

2. Проблема на самом деле была связана с чтением содержимого из файла, а не curl. По-видимому, каждая строка добавляла символ новой строки в конец строки, что очень странно, учитывая, что я не вносил никаких изменений в php, который считывал его из файла.