PHP fopen продолжает отказывать при вводе URL-адреса

#php #fopen

Вопрос:

Я играю с PHP и пытаюсь запустить этот пример кода:

 <?php
  // $target = "http://www.example.com/";
  $target = "http://www.schrenk.com/nostarch/webbots/hello_world.html";
  $output = "";

  // Fetch the file.
  if($file_handle = fopen($target, 'r')) {
    while (($buffer = fgets($file_handle, 4096)) !== false) {
      $output = $output . $buffer;
    }
    if(!feof($file_handle)) {
      $output = "Error: Unexpected fgets failn";
    }
    fclose($file_handle);
  } else {
    die("Error: fopen failedn");
  }
  echo $output;
?>
 

Я продолжаю получать эту ошибку для приведенного выше URL-адреса:

 Warning: fopen(http://www.schrenk.com/nostarch/webbots/hello_world.html/): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in <code.php> on line 3
 

Однако код работает для других URL-адресов, таких как «http://www.example.com», «https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview» и т.д.

Пожалуйста, помогите мне отладить это.

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

1. Как насчет http://www.schrenk.com/nostarch/webbots/hello_world.html (удаления завершающей косой черты / в конце) ?

2. Если вы откроете в браузере: http://www.schrenk.com/nostarch/webbots/hello_world.html/ он скажет, что 404 не найден, в то время http://www.schrenk.com/nostarch/webbots/hello_world.html как откроется правильно. поэтому удалите последнее / из URL

3. Кроме того, в чем смысл rawurlencode($target) ? Кстати, если это все еще не работает fopen() , это может быть запрещено для ботов.

4. Позвольте мне обновить код. Кроме того, отсутствие конечной косой черты создает для меня ту же проблему. Я использовал rawurlencode в первую очередь для отладки кода. Я удалил его из примера кода.

5. @ServingQuarantineperiod Привет. Пожалуйста, попробуйте запустить Php-код, по крайней мере, вместо того, чтобы просто посещать веб-сайт.

Ответ №1:

Как и предполагалось, сайт не позволяет ботам считывать с него данные. В качестве обходного пути вы можете смоделировать пользовательский агент браузера, чтобы сайт считал, что запрос поступает из реального браузера. Кроме того, чтение с помощью fopen() утомительно. Если вы просто хотите полностью зафиксировать ответ, curl это гораздо лучший вариант.

Отрывок:

 <?php

try{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, 'http://www.schrenk.com/nostarch/webbots/hello_world.html');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER , true);
  curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36");
  $response = curl_exec($ch);

  if(curl_errno($ch) !== 0){
     throw new Exception(curl_error($ch));
  }

  curl_close($ch);
  echo $response;
}catch(Exception $e){
  die("Error: " . $e->getMessage());
}