2010-01-21 13 views
81

Con PHP, è possibile inviare intestazioni HTTP con file_get_contents()?PHP file_get_contents() e impostazione delle intestazioni di richiesta

So che è possibile inviare l'agente utente dal file php.ini. Tuttavia, è possibile inviare anche altre informazioni come HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE e HTTP_CONNECTION con file_get_contents()?

Oppure c'è un'altra funzione che lo compirà?

risposta

228

In realtà, su ulteriori letture sulla funzione 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); 

si può essere in grado di seguire questo schema per ottenere ciò che si sta cercando di, mi rifugio' Ho provato personalmente questo però. (E se non funziona, sentitevi liberi di controllare il mio altra risposta)

+1

vedi anche: http://docs.php.net/context e http://docs.php.net/stream_context_create – VolkerK

+15

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

+9

Vorrei che più persone qui dessero la vera risposta a questa domanda invece di puntare semplicemente alla pagina cURL. Grazie. – Merijn

-2

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

1

L'utilizzo delle librerie php cURL sarà probabilmente la strada giusta da percorrere, in quanto questa libreria ha più funzioni rispetto al 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); 
?> 
+4

Il frammento si mostra è facile da raggiungere con 'file_get_contents' così e devo ancora imbattersi in un caso d'uso che si può ottenere solo con l'arricciatura. – Gordon

0

Se non avete bisogno di HTTPS e ricciolo non è disponibile sul sistema è possibile utilizzare fsockopen

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

+1

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

0

Sì.

Quando si chiama file_get_contents su un URL, si dovrebbe utilizzare la funzione stream_create_context, che è abbastanza ben documentato su php.net

questo è più o meno esattamente coperto nella pagina successiva a php.net nei commenti degli utenti sezione: http://php.net/manual/en/function.stream-context-create.php

+2

puoi mostrare un esempio invece di collegare semplicemente fuori sede? – Gordon

34

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

Codice:

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

uscita:

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" 
} 
+3

questo non risponde affatto alla domanda. – Gordon

+24

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 questa domanda. –

74

Ecco che cosa ha funzionato per me (Dominic era solo una breve linea).

$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); 
+5

Non si deve impersonare l'agente utente di un browser. Invece, crea una stringa User-Agent per il tuo strumento. http://www-archive.mozilla.org/build/revised-user-agent-strings.html potrebbe dare qualche idea sul formato. – Dereckson

+3

Ti stai sbagliando, non puoi cambiare l'agente utente in questo modo (usando l'intestazione). Ecco come fare: array ('http' => 'user_agent' => $ _SERVER ['HTTP_USER_AGENT']) – Vince

+0

+1 per risolvere il mio problema =) – Dave

Problemi correlati