PHP file_get_contents () и установка заголовков запросов

121

Можно ли с помощью PHP отправлять заголовки HTTP file_get_contents()?

Я знаю, что вы можете отправить пользовательский агент из своего php.iniфайла. Тем не менее, вы можете также отправить другую информацию , такую как HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGEи HTTP_CONNECTIONс file_get_contents()?

Или есть другая функция, которая выполнит это?

Маркус
источник

Ответы:

319

Собственно, при дальнейшем чтении file_get_contents()функции:

// Create a stream
$opts = [
    "http" => [
        "method" => "GET",
        "header" => "Accept-language: en\r\n" .
            "Cookie: foo=bar\r\n"
    ]
];

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://www.example.com/', false, $context);

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

Доминик Барнс
источник
18
это единственный полезный ответ на этой странице
Гордон
9
Я хочу, чтобы больше людей здесь давали реальный ответ на этот вопрос, а не просто указывали на страницу cURL. Спасибо.
Merijn
3
вдруг любопытно: что такое пользовательский агент по умолчаниюfile_get_contents() ? он указывает один?
Raptor
5
@Raptor, ini_set('user_agent', 'SomeBrowser v42.0.4711');зайдите на user-agent.me и скопируйте свой оттуда .. или отредактируйте php.ini, чтобы изменить его глобально
jaggedsoft
88

Вот что сработало для меня (Доминик не хватил одной строчки).

$url = "";

$options = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n" .  // check function.stream-context-create on php.net
              "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad 
  )
);

$context = stream_context_create($options);
$file = file_get_contents($url, false, $context);
Fabrice
источник
6
Вы не должны выдавать себя за пользовательский агент браузера. Вместо этого создайте строку User-Agent для вашего инструмента. www-archive.mozilla.org/build/revised-user-agent-strings.html может дать некоторое представление о формате.
Dereckson
1
@Vince Я думаю, что при определенных обстоятельствах это может работать в обоих направлениях. Установка такого заголовка агента в виде строки сработала в моем случае (WAF требовал непустого пользовательского агента для прохождения запроса)
dhaupin
3
@Vince В документации PHP указано, что оба могут использоваться, и "User-Agent" headerпереопределит user_agentэлемент массива, если оба указаны.
MrWhite
ПРИМЕЧАНИЕ. Никогда не используйте одинарные кавычки со строками, содержащими специальные символы, такие как \ n или \ r. PHP не будет их правильно интерпретировать, и в случае отправки заголовков ваши заголовки не будут отправлены правильно.
ak93
1
@Fanky, самым простым может быть YourTool / 1.0.0. Когда вы выпускаете новую версию, вы также можете повысить версию пользовательского агента, "YourTool / 1.3.5".
Dereckson
38

Вы можете использовать эту переменную для получения заголовков ответов после file_get_contents()функции.

Код:

  file_get_contents("http://example.com");
  var_dump($http_response_header);

Вывод:

array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
  [2]=>
  string(29) "Server: Apache/2.2.3 (CentOS)"
  [3]=>
  string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
  [4]=>
  string(27) "ETag: "280100-1b6-80bfd280""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 438"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(38) "Content-Type: text/html; charset=UTF-8"
}
ali_sed
источник
6
это вообще не отвечает на вопрос.
Гордон
32
Возможно, нет, но он отвечает на противоположный вопрос, подразумеваемый в заголовке, а именно, как читать заголовки ответов из file_get_contents. И именно здесь Google приземляется при исследовании ЭТОГО вопроса.
Rich Remer
0

Да.

При вызове file_get_contentsURL-адреса следует использовать stream_create_contextфункцию, которая довольно хорошо документирована на php.net.

Это более или менее точно описано на следующей странице php.net в разделе комментариев пользователей: http://php.net/manual/en/function.stream-context-create.php

Laereom
источник
-1

Использование библиотек php cURL, вероятно, будет правильным решением, поскольку эта библиотека имеет больше функций, чем просто file_get_contents(...).

Пример:

<?php
$ch = curl_init();
$headers = array('HTTP_ACCEPT: Something', 'HTTP_ACCEPT_LANGUAGE: fr, en, da, nl', 'HTTP_CONNECTION: Something');

curl_setopt($ch, CURLOPT_URL, "http://localhost"); # URL to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt($ch, CURLOPT_HTTPHEADER, $header ); # custom headers, see above
$result = curl_exec( $ch ); # run!
curl_close($ch);
?>
phidah
источник
5
Фрагмент, который вы показываете, также легко реализовать, file_get_contentsи я еще не встречал варианта использования, которого вы можете достичь только с помощью cURL.
Гордон
-2

Если вам не нужен HTTPS, а curl недоступен в вашей системе, вы можете использовать fsockopen

Эта функция открывает соединение, из которого вы можете читать и писать, как если бы вы делали с обычным дескриптором файла.

AlexB
источник
2
да, но это также означало бы, что OP должен реализовать протокол HTTP вручную. Кроме того, OP не спрашивал об альтернативах, file_get_contentsтак что это что-то вроде ответа не по теме.
Гордон
-4

К сожалению, это не похоже на file_get_contents()то, что действительно предлагает такую степень контроля. Расширение cURL обычно появляется первым, но я настоятельно рекомендую расширение PECL_HTTP ( http://pecl.php.net/package/pecl_http ) для очень простых и понятных HTTP-запросов. (работать с ним намного проще, чем cURL)

Доминик Барнс
источник