Заголовки php curl не возвращаются с сайта? - PullRequest
0 голосов
/ 03 ноября 2018

Я использую эту команду, чтобы вернуть заголовки с этой конкретной страницы.

curl -I https://www.gearbest.com/mobile-phones/pp_1686789.html?wid=1817324

Я запускаю указанную выше команду из терминала и получаю эти результаты ...

HTTP/2 200
content-type: text/html; charset=UTF-8
pragma: public
last-modified: Fri, 02 Nov 2018 18:15:13 GMT
gbcdnlang: en
access-control-allow-origin: *
access-control-allow-methods: GET, POST
ng-cache: HIT
x-edgeconnect-midmile-rtt: 36
x-edgeconnect-origin-mex-latency: 137
cache-control: public, max-age=60
expires: Fri, 02 Nov 2018 23:39:15 GMT
date: Fri, 02 Nov 2018 23:38:15 GMT
set-cookie: ORIGINDC=3;Domain=.gearbest.com;Path=/
set-cookie: ORIGINDCPC=3;Domain=.gearbest.com;Path=/
set-cookie: AKAM_CLIENTID=d51abedb38c60f8a5217ae15808769fc; expires=Mon, 31-Dec-2038 23:59:59 GMT; path=/; domain=.gearbest.com
vary: User-Agent

Пока все хорошо. Но когда я пытаюсь реализовать в PHP, используя код ниже, я получаю «URL не существует»! Что я делаю неправильно? Любая помощь приветствуется.

  $url1 = "https://www.gearbest.com/mobile-phones/pp_1686789.html?wid=1817324";
  $curl1 = curl_init($url1);
  curl_setopt($curl1, CURLOPT_NOBODY, true);
  curl_setopt($curl1, CURLOPT_CONNECTTIMEOUT, 0);
  curl_setopt($curl1, CURLOPT_TIMEOUT, 5); //timeout in seconds


  $result1 = curl_exec($curl1);

  if ($result1 !== false)
  {
    $statusCode1 = curl_getinfo($curl1, CURLINFO_HTTP_CODE);
    if ($statusCode1 == 404)
    {
      echo "URL Not Exists";
    }
    else
    {
       echo "URL Exists";
    }
  }
  else
  {
    echo "URL not Exists";
  }

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Попробуйте добавить опцию CURLOPT_SSL_VERIFYPEER, она подключается через SSl, но проверяет сертификат, например:

<?PHP
  $handle=curl_init('https://www.google.com');
  curl_setopt($handle, CURLOPT_VERBOSE, true);
  curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
  $content = curl_exec($handle);
  echo $content;
?>
0 голосов
/ 05 ноября 2018

Прежде всего, указанный вами код действителен. Вам не нужно изменять его.

Если вы просто попробуете это с экс. https://www.google.com это работает.

Проблема в том, что ваша версия PHP использует LibreSSL для соединений php-curl HTTPS.

У меня такая же проблема в macOS, где моя версия PHP использует OpenTransport .

Веб-сайт, к которому вы подключаетесь, требует установки SSL-соединения таким способом, который LibreSSL не может обработать.

Вам необходимо скомпилировать / установить OpenSSL и запустить свой код на интерпретаторе PHP, который был скомпилирован для использования его для php-curl.


Обновление:

поскольку вы работаете в macOS, вы можете скомпилировать PHP из исходного кода. Поиск в Google для macos compile php from source вернет список «рецептов» для этого.

Если вы используете brew для компиляции PHP (и всего «стека веб-приложений»), вы можете посмотреть здесь:

osx 10.10 Curl POST для URL HTTPS выдает ошибку SSLRead ()

В вопросе (и ответе) также рассматривается проблема, аналогичная той, которая возникла в вашем вопросе.

0 голосов
/ 05 ноября 2018

Я думаю, что это не твоя проблема. Я думаю, что они блокируют что-то, когда это требуется через PHP При использовании file_get_contents вы получите следующий вывод.

Warning: file_get_contents(): SSL: Operation timed out in /test.php on line 2
Warning: file_get_contents(https://www.gearbest.com/mobile-phones/pp_1686789.html?wid=1817324): failed to open stream: HTTP request failed!  in /test.php on line 2

Когда вы используете следующий URL в вашем скрипте, он работает нормально (https://www.test.de).

Я провел несколько других тестов с вашим скриптом, но я получаю каждый раз результат и ваш ожидаемый результат.

...