Почему get_headers () возвращает 400 неверных запросов, а CLI curl возвращает 200 OK? - PullRequest
0 голосов
/ 27 апреля 2018

Вот URL: https://www.grammarly.com

Я пытаюсь получить заголовки HTTP, используя встроенную функцию get_headers():

$headers = get_headers('https://www.grammarly.com')

Результат

HTTP/1.1 400 Bad Request
Date: Fri, 27 Apr 2018 12:32:34 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 52
Connection: close

Но если я сделаю то же самое с инструментом командной строки curl, результат будет другим:

curl -sI https://www.grammarly.com/

HTTP/1.1 200 OK
Date: Fri, 27 Apr 2018 12:54:47 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 25130
Connection: keep-alive

В чем причина такой разницы в ответах? Это какая-то плохо реализованная функция безопасности на стороне сервера Grammarly или что-то еще?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Это связано с тем, что get_headers() использует контекст потока по умолчанию, что в основном означает, что заголовки HTTP почти не отправляются на URL-адрес, о чем большинство удаленных серверов будут суетиться. Обычно отсутствующий заголовок, наиболее вероятно вызывающий проблемы, является User-Agent. Вы можете установить его вручную перед вызовом get_headers(), используя stream_context_set_default. Вот пример, который работает для меня:

$headers = get_headers('https://www.grammarly.com');

print_r($headers);

// has [0] => HTTP/1.1 400 Bad Request

stream_context_set_default(
    array(
        'http' => array(
            'user_agent'=>"php/testing"
        ),
    )
);

$headers = get_headers('https://www.grammarly.com');

print_r($headers);

// has [0] => HTTP/1.1 200 OK
0 голосов
/ 27 апреля 2018

Просто используйте для этого функцию php curl:

function getMyHeaders($url)
{
    $options = array(
        CURLOPT_RETURNTRANSFER => true,    
        CURLOPT_HEADER         => true,    
        CURLOPT_FOLLOWLOCATION => true,    
        CURLOPT_USERAGENT      => "spider",
        CURLOPT_AUTOREFERER    => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_NOBODY => true
    );
    $ch = curl_init($url);
    curl_setopt_array($ch, $options);
    $content = curl_exec($ch);
    curl_close($ch);
    return $content;
}
print_r(getMyHeaders('https://www.grammarly.com'));
...