2010-03-30 12 views
5

Sto tentando di scaricare il contenuto di una pagina Web utilizzando PHP. Quando ho il comando:PHP file_get_contents() si comporta in modo diverso per il browser

$f = file_get_contents("http://mobile.mybustracker.co.uk/mobile.php?searchMode=2"); 

Esso restituisce una pagina che riporta che il server è inattivo. Eppure quando incollo lo stesso URL nel mio browser ottengo la pagina prevista.

Qualcuno ha idea di cosa sta causando questo? File_get_contents trasmette intestazioni che lo differenziano da una richiesta del browser?

risposta

16

Sì, ci sono differenze - il browser tende a inviare un sacco di addizionale HTTP headers, direi; e quelli che vengono inviati da entrambi probabilmente non hanno lo stesso valore.

Qui, dopo aver eseguito un paio di test, sembra che passare l'intestazione HTTP denominata Accept sia necessario.

questo può essere fatto utilizzando il terzo parametro di file_get_contents, per specificare le informazioni di contesto addizionale:

$opts = array('http' => 
    array(
     'method' => 'GET', 
     //'user_agent ' => "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100301 Ubuntu/9.10 (karmic) Firefox/3.6", 
     'header' => array(
      'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*\/*;q=0.8 
' 
     ), 
    ) 
); 
$context = stream_context_create($opts); 

$f = file_get_contents("http://mobile.mybustracker.co.uk/mobile.php?searchMode=2", false, $context); 
echo $f; 

Con questo, sono in grado di ottenere il codice HTML della pagina.


Note:

  • ho provato passando il User-Agent, ma non sembra essere necessaria - che è il motivo per cui la linea corrispondente è qui come un commento
  • Il valore viene utilizzato per l'intestazione Accept è quello utilizzato da Firefox quando ho richiesto quella pagina con Firefox prima di provare con file_get_contents.
    • Alcuni altri valori potrebbero essere OK, ma non ho fatto alcun test per determinare quale valore è quello richiesto.


Per maggiori informazioni, è possibile dare un'occhiata a:

-3

sostituire tutti gli spazi con% 20

Problemi correlati