Michael: Mit fsockopen auf redirect prüfen

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

  1. 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?

    • Abtrennung der Header vom Body?
    • Separation der Header?
    • Aufbau einer Schleife, solange weitergeleitet (oder ähnliches) wird?

    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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. $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.de

      Tom

      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

      1. 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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. 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

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. 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

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. 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.de

              Tom

              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

            2. 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

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. 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

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau

                1. hi,

                  [1] Wie er den erkennt, wäre wieder eine andere Frage.

                  Mach mal Vorschläge. :-)

                  rand(0, 1)

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }