2016-08-24 1 views
2

Arbeitslösung am Ende der Beschreibung!PHP - `get_headers` gibt "400 ungültige Anfrage" und "403 verboten" für gültige URLs zurück?

Ich verwende PHP 5.4 und versuche, die Header einer Liste von URLs zu erhalten.

Zum größten Teil funktioniert alles gut, aber es gibt drei URLs, die Probleme verursachen (und wahrscheinlich mehr, mit umfangreicheren Tests).

'http://www.alealimay.com' 
'http://www.thelovelist.net' 
'http://www.bleedingcool.com' 

Alle drei Standorten arbeiten in einem Browser in Ordnung, und produzieren die folgenden Header-Antworten:

(von Safari)

successful headers

Beachten Sie, dass alle drei Header-Antworten sind Code = 200

Aber die Header über PHP abrufen, mit get_headers ...

stream_context_set_default(array('http' => array('method' => "HEAD"))); 
$headers = get_headers($url, 1); 
stream_context_set_default(array('http' => array('method' => "GET"))); 

... gibt die folgende:

url ...... "http://www.alealimay.com" 

headers 
| 0 ............................ "HTTP/1.0 400 Bad Request" 
| content-length ............... "378" 
| X-Synthetic .................. "true" 
| expires ...................... "Thu, 01 Jan 1970 00:00:00 UTC" 
| pragma ....................... "no-cache" 
| cache-control ................ "no-cache, must-revalidate" 
| content-type ................. "text/html; charset=UTF-8" 
| connection ................... "close" 
| date ......................... "Wed, 24 Aug 2016 01:26:21 UTC" 
| X-ContextId .................. "QIFB0I8V/xsTFMREg" 
| X-Via ........................ "1.0 echo109" 



url ...... "http://www.thelovelist.net" 

headers 
| 0 ............................ "HTTP/1.0 400 Bad Request" 
| content-length ............... "378" 
| X-Synthetic .................. "true" 
| expires ...................... "Thu, 01 Jan 1970 00:00:00 UTC" 
| pragma ....................... "no-cache" 
| cache-control ................ "no-cache, must-revalidate" 
| content-type ................. "text/html; charset=UTF-8" 
| connection ................... "close" 
| date ......................... "Wed, 24 Aug 2016 01:26:22 UTC" 
| X-ContextId .................. "aNKvf2RB/bIMjWyjW" 
| X-Via ........................ "1.0 echo103" 



url ...... "http://www.bleedingcool.com" 

headers 
| 0 ............................ "HTTP/1.1 403 Forbidden" 
| Server ....................... "Sucuri/Cloudproxy" 
| Date ......................... "Wed, 24 Aug 2016 01:26:22 GMT" 
| Content-Type ................. "text/html" 
| Content-Length ............... "5311" 
| Connection ................... "close" 
| Vary ......................... "Accept-Encoding" 
| ETag ......................... "\"57b7f28e-14bf\"" 
| X-XSS-Protection ............. "1; mode=block" 
| X-Frame-Options .............. "SAMEORIGIN" 
| X-Content-Type-Options ....... "nosniff" 
| X-Sucuri-ID .................. "11005" 

Dies ist der Fall, unabhängig davon, Änderung der stream_context

//stream_context_set_default(array('http' => array('method' => "HEAD"))); 
$headers = get_headers($url, 1); 
//stream_context_set_default(array('http' => array('method' => "GET"))); 

das gleiche Ergebnis liefert.

Es werden keine Warnungen oder Fehler ausgegeben (normalerweise werden die Fehler mit @get_headers unterdrückt, aber es gibt keinen Unterschied).

Ich habe meine php.ini überprüft und allow_url_fopen auf On festgelegt.

Ich gehe in Richtung stream_get_meta_data, und bin nicht interessiert an CURL Lösungen. stream_get_meta_data (und seine begleitende fopen) wird an der gleichen Stelle wie get_headers fehlschlagen, so dass die Reparatur wird beide in diesem Fall beheben.

Normalerweise, wenn es Umleitungen sind, sieht die Ausgabe wie:

url ...... "http://www.startingURL.com/" 

headers 
| 0 ............................ "HTTP/1.1 301 Moved Permanently" 
| 1 ............................ "HTTP/1.1 200 OK" 
| Date 
| | "Wed, 24 Aug 2016 02:02:29 GMT" 
| | "Wed, 24 Aug 2016 02:02:32 GMT" 
|  
| Server 
| | "Apache" 
| | "Apache" 
|  
| Location ..................... "http://finishingURL.com/" 
| Connection 
| | "close" 
| | "close" 
|  
| Content-Type 
| | "text/html; charset=UTF-8" 
| | "text/html; charset=UTF-8" 
|  
| Link ......................... "; rel=\"https://api.w.org/\", ; rel=shortlink" 

Wie kommen die Websites in Browsern funktionieren, aber fehlschlagen, wenn get_headers mit?

Es gibt verschiedene SO Beiträge die gleiche Sache zu diskutieren, aber die Lösung für alle von ihnen gehört nicht zu diesem Fall:

POST requires Content-Length (Ich schicke eine HEAD Anfrage, keine Inhalte zurückgegeben wird)

URL contains UTF-8 data (die einzigen Zeichen in diese URLs sind alle aus dem lateinischen Alphabet)

Cannot send a URL with spaces in it (Diese URLs sind alle raumfrei und sehr gewöhnlich in jeder Hinsicht)

Lösung!

(Danke an Max in den Antworten unten für mich auf dem richtigen Weg zeigt.)

Das Problem ist, weil es keine vordefinierte user_agent, ohne entweder in php.ini auf Einstellung, oder erklärt es in Code.

Also ändere ich die user_agent, um einen Browser nachzuahmen, die Tat zu tun, und stelle sie dann zurück, um Wert anzugeben (vermutlich leer).

$OriginalUserAgent = ini_get('user_agent'); 
ini_set('user_agent', 'Mozilla/5.0'); 

$headers = @get_headers($url, 1); 

ini_set('user_agent', $OriginalUserAgent); 

Benutzeragentenänderung gefunden here.

+0

Vergessen Sie nicht, Antwort zu akzeptieren – waki

+0

@waki, die Antwort ist nicht korrekt, und verwendet 'curl', die ich ausdrücklich gesagt habe, wollte ich nicht verwenden. Wie gesagt, es hat mich in die richtige Richtung gelenkt, und ich habe Kredit gegeben und danke, wo es nötig war, anstatt es abzustimmen. – Birrel

+0

können Sie Ihre Antwort veröffentlichen und ihn akzeptieren, um die Frage als gelöst zu stellen. – waki

Antwort

3

Es passiert, weil alle drei diese Sites UserAgent Header der Anfrage und Antwort mit einem Fehler in diesem Fall überprüfen, wenn es nicht gefunden werden konnte. Funktion senden Sie diese Kopfzeile nicht. Sie können für das Erhalten Inhalte der Seiten, cURL und diesen Code-Schnipsel versuchen:

$url = 'http://www.alealimay.com'; 
$c = curl_init($url); 
curl_setopt($c, CURLOPT_USERAGENT, 'curl/7.48.0'); 
curl_exec($c); 
var_dump(curl_getinfo($c)); 

UPD: Es ist nicht notwendig cURL zu verwenden für User-Agent-Header zu setzen. Es kann auch mit ini_set('user_agent', 'Mozilla/5.0'); getan werden und dann get_headers Funktion verwendet konfigurierten Wert.

+0

Der Code, den Sie angegeben haben, druckt wörtlich die gesamte Website. Es ist eine Verschwendung, all diese Daten zu bekommen, wenn ich nur am Header interessiert bin. Sie [setzen mich auf den richtigen Weg durch] (http://stackoverflow.com/questions/8403025/how-to-set-user-agent-for-get-headers-php-function). – Birrel

+1

Sie sind herzlich willkommen @Birrel! – max

+0

Vielen Dank, Freund. – Birrel

Verwandte Themen