PHP file_get_contents () und Festlegen von Anforderungsheadern

121

Ist es mit PHP möglich, HTTP-Header mit zu senden file_get_contents()?

Ich weiß, dass Sie den Benutzeragenten aus Ihrer php.iniDatei senden können . Sie können jedoch auch andere Informationen wie senden HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGEund HTTP_CONNECTIONmit file_get_contents()?

Oder gibt es eine andere Funktion, die dies erreicht?

Marcus
quelle

Antworten:

318

Nach weiterer Lektüre der file_get_contents()Funktion:

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

Möglicherweise können Sie diesem Muster folgen, um das zu erreichen, was Sie suchen. Ich habe dies jedoch nicht persönlich getestet. (und wenn es nicht funktioniert, zögern Sie nicht, meine andere Antwort zu überprüfen)

Dominic Barnes
quelle
18
Dies ist die einzige nützliche Antwort auf dieser Seite
Gordon
9
Ich wünschte, mehr Leute hier würden die eigentliche Antwort auf diese Frage geben, anstatt nur auf die cURL-Seite zu zeigen. Vielen Dank.
Merijn
3
plötzlich neugierig: Was ist der Standard - User - Agent von file_get_contents()? gibt es eine an?
Raptor
5
@Raptor ini_set('user_agent', 'SomeBrowser v42.0.4711');gehen Sie zu user-agent.me und kopieren Sie Ihre von dort .. oder bearbeiten Sie php.ini, um es global zu ändern
jaggedsoft
88

Hier ist, was für mich funktioniert hat (Dominic war nur eine Zeile kurz).

$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
quelle
6
Sie sollten sich nicht als Benutzeragent eines Browsers ausgeben. Erstellen Sie stattdessen eine User-Agent-Zeichenfolge für Ihr Tool. www-archive.mozilla.org/build/revised-user-agent-strings.html könnte eine Vorstellung vom Format geben.
Dereckson
1
@ Da ich denke, dass es unter bestimmten Umständen in beide Richtungen funktionieren kann. Das Setzen des Agenten-Headers als Zeichenfolge funktionierte in meinem Fall (WAF benötigte einen nicht leeren Benutzeragenten, damit die Anforderung übergeben werden konnte)
Dhaupin
3
@Vince In den PHP-Dokumenten wird angegeben, dass beide verwendet werden können und der "User-Agent" headerdas user_agentArray-Element überschreibt , wenn beide angegeben sind.
MrWhite
HINWEIS: Verwenden Sie niemals einfache Anführungszeichen mit Zeichenfolgen, die Sonderzeichen wie \ n oder \ r enthalten. PHP interpretiert sie nicht richtig und beim Senden von Headern werden Ihre Header nicht korrekt gesendet.
Ak93
1
@Fanky das einfachste könnte "YourTool / 1.0.0" sein. Wenn Sie eine neue Version veröffentlichen, können Sie auch die User-Agent-Version "YourTool / 1.3.5" aktivieren.
Dereckson
39

Mit dieser Variablen können Sie Antwortheader nach der file_get_contents()Funktion abrufen .

Code:

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

Ausgabe:

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
quelle
6
Dies beantwortet die Frage überhaupt nicht.
Gordon
32
Vielleicht nicht, aber es beantwortet die entgegengesetzte Frage, die im Titel enthalten ist: Wie werden die Antwortheader aus file_get_contents gelesen? Und hier landet Google, wenn es darum geht, DIESE Frage zu untersuchen.
Rich Remer
0

Ja.

Wenn man file_get_contentseine URL aufruft , sollte man die stream_create_contextFunktion verwenden, die auf php.net ziemlich gut dokumentiert ist.

Dies wird mehr oder weniger genau auf der folgenden Seite von php.net im Abschnitt mit den Benutzerkommentaren behandelt: http://php.net/manual/en/function.stream-context-create.php

Laereom
quelle
-1

Die Verwendung der PHP-CURL-Bibliotheken ist wahrscheinlich der richtige Weg, da diese Bibliothek mehr Funktionen als die einfachen bietet file_get_contents(...).

Ein Beispiel:

<?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
quelle
5
Das Snippet, das Sie zeigen, ist ebenfalls leicht zu erreichen, file_get_contentsund ich habe noch keinen Anwendungsfall gefunden, den Sie nur mit cURL erreichen können.
Gordon
-1

Wenn Sie kein HTTPS benötigen und Curl auf Ihrem System nicht verfügbar ist, können Sie es verwenden fsockopen

Diese Funktion öffnet eine Verbindung, über die Sie wie mit einem normalen Dateihandle lesen und schreiben können.

AlexB
quelle
2
Ja, aber es würde auch bedeuten, dass das OP das HTTP-Protokoll von Hand implementieren muss. Außerdem hat das OP nicht nach Alternativen gefragt, file_get_contentsso dass dies eine nicht zum Thema gehörende Antwort ist.
Gordon
-3

Leider sieht es nicht so aus, als ob es file_get_contents()wirklich diesen Grad an Kontrolle bietet. Die cURL-Erweiterung ist normalerweise die erste, die angezeigt wird. Ich würde jedoch die PECL_HTTP-Erweiterung ( http://pecl.php.net/package/pecl_http ) für sehr einfache und unkomplizierte HTTP-Anforderungen empfehlen . (Es ist viel einfacher zu arbeiten als mit cURL)

Dominic Barnes
quelle