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. Дякую.
Мерійн

3
раптом цікаво: що це за замовчуванням користувацький агент file_get_contents()? це вказує один?
Раптор

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);

6
Вам не слід видавати себе за агента користувача браузера. Натомість створіть рядок User-Agent для свого інструменту. www-archive.mozilla.org/build/revid-user-agent-strings.html може дати деяке уявлення про формат.
Дерексон

1
@Вінс, я думаю, що це може працювати в обох випадках у певних обставинах. Налаштування заголовка агента таким чином, як рядок, працювала в моєму випадку (для запиту для передачі 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".
Дерексон

39

Ви можете використовувати цю змінну для отримання заголовків відповідей після 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"
}

6
це зовсім не відповідає на питання.
Гордон

32
Можливо, ні, але він відповідає на протилежне запитання, що міститься в заголовку, а саме - як читати заголовки відповідей з file_get_contents. І саме тут Google приземляється при дослідженні цього питання.
Річ Ремер

0

Так.

При дзвінку file_get_contentsза URL-адресою слід скористатися stream_create_contextфункцією, яка досить добре зафіксована на php.net.

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


-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);
?>

5
Показаний фрагмент також легко досягти file_get_contents, і я ще не стикався з випадком використання, якого ви можете досягти лише за допомогою CURL.
Гордон

-1

Якщо вам не потрібен HTTPS, а згортання недоступне у вашій системі, яку ви можете використовувати fsockopen

Ця функція відкриває з'єднання, з якого ви можете читати і писати так, як ви це робите зі звичайною ручкою файлів.


2
так, але це також означатиме, що ОП має вручну реалізувати протокол HTTP. Крім того, ОП не запитувала про альтернативи, file_get_contentsтому це дещо не відповідає темі.
Гордон

-3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.