PHP file_get_contents () e impostazione delle intestazioni della richiesta


121

Con PHP, è possibile inviare intestazioni HTTP con file_get_contents()?

So che puoi inviare l'agente utente dal tuo php.inifile. Tuttavia, si può anche inviare altre informazioni come HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGEe HTTP_CONNECTIONcon file_get_contents()?

O c'è un'altra funzione che compirà questo?

Risposte:


319

In realtà, dopo ulteriori letture sulla file_get_contents()funzione:

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

Potresti essere in grado di seguire questo schema per ottenere ciò che stai cercando, ma non l'ho testato personalmente. (e se non funziona, sentiti libero di controllare la mia altra risposta)



18
questa è l'unica risposta utile in questa pagina
Gordon

9
Vorrei che più persone qui dessero la risposta effettiva a questa domanda invece di indicare semplicemente la pagina cURL. Grazie.
Merijn

3
improvvisamente curioso: qual è il programma utente predefinitofile_get_contents() ? ne specifica uno?
Raptor

5
@ Raptor ini_set('user_agent', 'SomeBrowser v42.0.4711');vai su user-agent.me e copia il tuo da lì .. o modifica php.ini per cambiarlo a livello globale
jaggedsoft

88

Ecco cosa ha funzionato per me (Dominic era solo una riga corta).

$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
Non dovresti impersonare l'agente utente di un browser. Crea invece una stringa User-Agent per il tuo strumento. www-archive.mozilla.org/build/revised-user-agent-strings.html potrebbe dare un'idea del formato.
Dereckson

1
@Vince Penso che possa funzionare in entrambi i modi in determinate circostanze. L'impostazione dell'intestazione dell'agente in questo modo, come stringa, ha funzionato nel mio caso (WAF necessitava di un agente utente non vuoto per il passaggio della richiesta)
dhaupin

3
@Vince La documentazione PHP afferma che entrambi possono essere utilizzati e "User-Agent" headersovrascriverà l' user_agentelemento array, se entrambi sono specificati.
MrWhite

NOTA: non utilizzare mai virgolette singole con stringhe contenenti caratteri speciali come \ n o \ r. PHP non li interpreterà correttamente e in caso di invio di intestazioni, le tue intestazioni non verranno inviate correttamente.
ak93

1
@Fanky il più semplice potrebbe essere "YourTool / 1.0.0". Quando rilasci una nuova versione, puoi eseguire il bump anche della versione dell'agente utente, "YourTool / 1.3.5".
Dereckson

38

È possibile utilizzare questa variabile per recuperare le intestazioni di risposta dopo la file_get_contents()funzione.

Codice:

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

Produzione:

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
questo non risponde affatto alla domanda.
Gordon

32
Forse no, ma risponde alla domanda opposta implicita nel titolo, che è come leggere le intestazioni di risposta da file_get_contents. Ed è qui che Google atterra quando indaga su QUELLA domanda.
Rich Remer


-1

L'uso delle librerie php cURL sarà probabilmente la strada giusta da percorrere, poiché questa libreria ha più funzionalità rispetto alla semplice file_get_contents(...).

Un esempio:

<?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
Anche lo snippet che mostri è facile da ottenere file_get_contentse devo ancora imbattermi in un caso d'uso che puoi ottenere solo con cURL.
Gordon

-2

Se non hai bisogno di HTTPS e curl non è disponibile sul tuo sistema, puoi usare fsockopen

Questa funzione apre una connessione dalla quale puoi leggere e scrivere come faresti con un normale handle di file.


2
sì, ma significherebbe anche che l'OP deve implementare manualmente il protocollo HTTP. Inoltre, l'OP non ha chiesto alternative a, file_get_contentsquindi questa è in qualche modo una risposta fuori tema.
Gordon

-4

Sfortunatamente, non sembra che file_get_contents()offra davvero quel grado di controllo. L'estensione cURL è solitamente la prima a venire fuori, ma consiglio caldamente l'estensione PECL_HTTP ( http://pecl.php.net/package/pecl_http ) per richieste HTTP molto semplici e dirette. (è molto più facile lavorare con cURL)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.