Mit fsockopen auf redirect prüfen
Michael
- php
Guten Morgen liebe selfhtml Gemeinde ;)
Ich muss ein Skript schreiben, dass Webseiten untersucht, dabei soll auch ein redirect abgefragt werden. Nach einiger Zeit des Suchens bin ich auf fsockopen gestoßen und habe mir auch eine kleine Funktion zusammengebastelt (<-- das Wort passt hier echt am besten ;) ). Nunja, das funzt aber noch nicht ganz, da ich bei manchen Domains einen Fehler bekomme, obwohl diese vorhanden ist. Auch werden manche redirects nicht erkannt.
Hier mal die Funktion:
function is_redirected($url)
{
$url = substr($url, 7); //entfernt das http://
//http header und quelltext der seite wird ausgelesen
$fp = @fsockopen ($url, 80, $errno, $errstr, 5);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$request = "GET / HTTP/1.0\r\n"
."Host: ".$url."\r\n"
."User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3\r\n"
."Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
."Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
."Referer: http://www.example.com\r\n\r\n";
fputs ($fp, $request);
while (!feof($fp)) {
$result .= fgets($fp,128);
}
fclose($fp);
}
//statuscode wird ausgelesen
$start = strpos($result, "HTTP/1.")+9; //muster + leerzeichen
if($start === false) die("Fehler");
else $status = substr($result, $start, 3);
//statuscode wird analysiert
if( (strpos($status, "301") === false) && (strpos($status, "302") === false) && (strpos($status, "303") === false))
$redirect = false;
else $redirect = true;
//redirect location auslesen
$start = strpos($result, "Location:") +10;
$temp = substr($result, $start, 100);
$end = strpos($temp,"\r\n");
$location = substr($temp,0,$end);
if(!$redirect)
{
return $redirect;
}else
{
return $location;
}
}//end function
Hat jemand von euch vielleicht einen Vorschlag, wie man das besser machen könnte, nachdem er sich diese "Funktion" angesehen hat? Ich arbeite noch nicht sehr lange mit PHP.
Was die Funktion können soll: Eine Url auf einen redirect prüfen. Wird bei von http://example.com auch diese Seite aufgerufen oder nicht (z.B. http://www.example.com).
Bin für Hilfe jeder Art dankbar.
Bis dann, Michi
Hello Michi,
$request = "GET / HTTP/1.0\r\n"
nur BTW: da würde ein HEAD-Request dann wohl auch genügen.
Wo Fehler stecken, habe ich noch nicht gesehen.
Was soll denn besser werden?
Schau Die nochmal http://www.php.net/manual/en/function.apache-response-headers.php an.
Vielleicht hilft es Dir?
Es könnte ja sein, dass zwischendurch ein 400er oder 500er Status kommt.
Abfragen müsstest Du dann wahrscheinlich solange, bis "not modified" ,"200 OK" oder eine Ablehnugn des Requests als Status kommen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
$request = "GET / HTTP/1.0\r\n"
nur BTW: da würde ein HEAD-Request dann wohl auch genügen.
[...]
Harzliche Grüße vom Berg
http://www.annerschbarrich.deTom
Danke Tom, ich hab das mit dem HEAD Request umgesetzt. Naja, ich bin so mit der Funktion zwar noch nicht zufrieden, lass das dann aber mal so. Ist nur eine Funktion meines Skriptes.
Danke nochmal.
Gruß Michael
Hello,
Danke Tom, ich hab das mit dem HEAD Request umgesetzt. Naja, ich bin so mit der Funktion zwar noch nicht zufrieden, lass das dann aber mal so. Ist nur eine Funktion meines Skriptes.
Denk aber auch an die Schleife.
Solange nicht das erwartete Ergebnis kommt, oder eben ein Abbruch-Statuscode muss man ggf. weiter fragen (Requests senden).
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
hi,
Denk aber auch an die Schleife.
Solange nicht das erwartete Ergebnis kommt, oder eben ein Abbruch-Statuscode muss man ggf. weiter fragen (Requests senden).
Denk aber auch ans Aussteigen.
Wenn ein Server mal Mist baut, und Redirects "loopt", soll das Script ja nicht ebenfalls bis zum jüngsten Tag dabei mitspielen.
gruß,
wahsaga
Hello,
Denk aber auch an die Schleife.
Solange nicht das erwartete Ergebnis kommt, oder eben ein Abbruch-Statuscode muss man ggf. weiter fragen (Requests senden).Denk aber auch ans Aussteigen.
Wenn ein Server mal Mist baut, und Redirects "loopt", soll das Script ja nicht ebenfalls bis zum jüngsten Tag dabei mitspielen.
Das würde passieren, wenn ein zirkuläre Verlauf besteht.
Das würde also bedeuten, dass man die URLs (oder sogar die URis ?) loggen müsste. Taucht eine auf, die schon einmal in der Liste steht, besteht ein zirkulärer Verlauf, oder?
Gar nicht so uninteressant das Thema!
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
Denk aber auch an die Schleife.
Solange nicht das erwartete Ergebnis kommt, oder eben ein Abbruch-Statuscode muss man ggf. weiter fragen (Requests senden).[...]
Harzliche Grüße vom Berg
http://www.annerschbarrich.deTom
Ich habs jetzt einfach mal dabei belassen abzufragen, ob ein 301er,302er,303er oder 307er kommt, wenn nicht, nehme ich einfach an, dass nicht weitergeleitet wird.
Funktioniert ja auch in den Fällen, wo sauber weitergeleitet wird. Ist die Weiterleitung nicht sauber, könnte Sie für mein Tool genauso gut nicht vorhanden sein.
Naja, danke nochmal für dir Hilfe.
Michi
hi,
Das würde passieren, wenn ein zirkuläre Verlauf besteht.
Das würde also bedeuten, dass man die URLs (oder sogar die URis ?) loggen müsste. Taucht eine auf, die schon einmal in der Liste steht, besteht ein zirkulärer Verlauf, oder?
Muss nicht unbedingt.
Vielleicht entscheidet sich der Server ja, nur beim ersten Request nach Ressource X auf Y umzuleiten - beim "zweiten" [1] Request nach Ressource X dann aber nicht mehr.
[1] Wie er den erkennt, wäre wieder eine andere Frage.
gruß,
wahsaga
Hello,
Vielleicht entscheidet sich der Server ja, nur beim ersten Request nach Ressource X auf Y umzuleiten - beim "zweiten" [1] Request nach Ressource X dann aber nicht mehr.
[1] Wie er den erkennt, wäre wieder eine andere Frage.
Mach mal Vorschläge. :-)
Eine Session besteht schließlich noch nicht.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
hi,
[1] Wie er den erkennt, wäre wieder eine andere Frage.
Mach mal Vorschläge. :-)
rand(0, 1)
gruß,
wahsaga