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)
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.
Vergessen Sie nicht, Antwort zu akzeptieren – waki
@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
können Sie Ihre Antwort veröffentlichen und ihn akzeptieren, um die Frage als gelöst zu stellen. – waki