Rosalie Th.: Header auslesen. Warum geben einige URL's keine Daten zurück?

Hallo

Wie der Betreff schon sagt, versuche ich den Header (brauche nur den Server-Status) fremder URL's auslesen.

Das funktioniert bei den meisten URL's auch. Nur zum Beispiel bei www.ambassadorhotel.ch nicht.

Ich habe es mit cURL, fsockopen und get_headers erfolglos versucht.
Die Domain ist via Browser problemlos erreichbar.

Meine Frage nun: Warum funktionieren meine Versuche nicht? Da ich leider
keinen Anhaltspunkt fand, bitte ich Euch um einen Tipp.

Beim Googlen nach einer Lösung bin ich auf eine Website gestossen, auf der
man solche Abfragen machen kann. Dort kriegte ich die Header-Infos. Leider
habe ich vergessen, auf welcher Website das war. Zu dumm ;)

Vielen Dank schonmal
Rosa

  1. Hi!

    Wie der Betreff schon sagt, versuche ich den Header (brauche nur den Server-Status) fremder URL's auslesen.
    Das funktioniert bei den meisten URL's auch. Nur zum Beispiel bei www.ambassadorhotel.ch nicht.

    Um zu beurteilen, wo genau dabei vielleicht die Problemursache liegen könnte, wäre es hilfreich, wenn du das etwas detailreicher beschrieben hättest, vielleicht sogar mit einem auf das Problem reduzierten und nachvollziehbaren Codeausschnitt.

    Ich habe es mit cURL, fsockopen und get_headers erfolglos versucht.
    Die Domain ist via Browser problemlos erreichbar.

    Die Ursache ist sehr wahrscheinlich, dass der Browser etwas anders macht als du. Zum Beispiel senden Browser eine Menge unnütz erscheinende Header in ihrem Request mit.

    Lo!

    1. Hier der get_headers Code, den ich verwendet habe:

      <?php  
      $url = 'http://www.ambassadorhotel.ch';  
      print_r(get_headers($url, 0));  
      ?>
      

      Hilft Dir das?

      Mit der URL: http://www.titlis.ch funktioniert es.

      1. Hello,

        Hier der get_headers Code, den ich verwendet habe:

        <?php

        $url = 'http://www.ambassadorhotel.ch';
        print_r(get_headers($url, 0));
        ?>

          
        Mit welchem Request arbeitet get\_headers() denn? Benutzt das vielleicht einen HEAD-Request anstelle von GET? Es könnte durchaus sein, dass der Server keine HEAD-Requests beantworten mag. Das wäre zwar ungewöhnlich, aber eine Erklärung.  
          
        Für get\_headers() würde ein HEAD-Request jedenfalls genügen.  
          
          
          
          
          
        Liebe Grüße aus dem schönen Oberharz  
          
          
        Tom vom Berg  
        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          
        
        -- 
         ☻\_  
        /▌  
        / \ Nur selber lernen macht schlau  
        <http://bergpost.annerschbarrich.de>
        
        1. Hi Tom

          Mit welchem Request arbeitet get_headers() denn?

          Gute Frage! Ich weiss es nicht. Werde mich schlau machen.

          Danke
          Rosa

          1. Hello Rosalie,

            es funktioniert auch mit einem Head-request:

            Das Scriptlein

            -------------------------------------------------------
            <?php   ### fsockopen.php ###

            get headers of response

            $host = "www.ambassadorhotel.ch";

            $fp = fsockopen($host, 80, $errno, $errstr, 30);

            if (!$fp)
                {
                    die("Fehler: $errstr ($errno)<br />\r\n");
                }

            $out = "HEAD / HTTP/1.1\r\n";
                $out .= "Host: $host\r\n";
                $out .= "Connection: Close\r\n\r\n";

            fwrite($fp, $out);
                $responsestr = '';

            while (!feof($fp))
                {
                    $responsestr .= fread($fp, 128);
                }

            fclose($fp);

            $_response = explode ("\r\n", $responsestr);
                echo "<pre>\r\n";

            foreach($_response as $lineno => $linestr)
                {
                    if ($linestr == "\r\n");
                    echo htmlspecialchars($linestr) . "\r\n";
                }
                echo "</pre>\r\n";
            ?>
            ------------------------------------------------------

            liefert diese Antwort:

            HTTP/1.1 200 OK
            Date: Tue, 11 Jan 2011 16:30:51 GMT
            Server: Apache/2.2.3 (CentOS)
            X-Powered-By: PHP/5.1.6
            Set-Cookie: PHPSESSID=v4v2jch81m0qo7d5p0qd2h6uf3; path=/
            Expires: Thu, 19 Nov 1981 08:52:00 GMT
            Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
            Pragma: no-cache
            Connection: close
            Content-Type: text/html

            Und die sieht mir doch ziemlich ähnlich aus, die die auf den Request aus dem Browser.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hello,

              Und es funktioniert sogar trotz des Fehlers ;-P


              <?php   ### fsockopen.php ###

              get headers of response

              $host = "www.ambassadorhotel.ch";

              $fp = fsockopen($host, 80, $errno, $errstr, 30);

              if (!$fp)
                  {
                      die("Fehler: $errstr ($errno)<br />\r\n");
                  }

              $out = "HEAD / HTTP/1.1\r\n";
                  $out .= "Host: $host\r\n";
                  $out .= "Connection: Close\r\n\r\n";

              fwrite($fp, $out);
                  $responsestr = '';

              while (!feof($fp))
                  {
                      $responsestr .= fread($fp, 128);
                  }

              fclose($fp);

              $_response = explode ("\r\n", $responsestr);
                  echo "<pre>\r\n";

              foreach($_response as $lineno => $linestr)
                  {

              falsch  if ($linestr == "\r\n");

              if (strlen($linestr) == 0) break;

              echo htmlspecialchars($linestr) . "\r\n";
                  }
                  echo "</pre>\r\n";
              ?>

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hello,

                Und es funktioniert sogar trotz des Fehlers ;-P

                Hallo Tom

                Danke für Dein Script. Sowas ähnliches habe ich auch schon
                versucht. Nun, der Fehler liegt also definitiv nicht am
                Script. Ich kriege nämlich folgende Fehlermeldung:
                Fehler: Connection timed out (110)

                Da ich die php.ini anpassen kann, habe ich den Wert von
                "default_socket_timeout" angepasst. Leider erfolglos.
                Weisst Du zufällig, wo man schrauben muss?

                Liebe Grüsse
                Rosa

                1. Hello,

                  Danke für Dein Script. Sowas ähnliches habe ich auch schon
                  versucht.

                  Hast Du es mal mit meinem Script versucht?

                  Nun, der Fehler liegt also definitiv nicht am
                  Script. Ich kriege nämlich folgende Fehlermeldung:
                  Fehler: Connection timed out (110)

                  Da ich die php.ini anpassen kann, habe ich den Wert von
                  "default_socket_timeout" angepasst. Leider erfolglos.
                  Weisst Du zufällig, wo man schrauben muss?

                  Es gibt nur zwei Schrauben, eine für die Socket-Eröffnung und eine für die anschließenden Leseanforderungen.

                  Aber es gibt u.U. widerborstige (fehlkonfigurierte) Firewalls, die bestimmte Zugriffe von innen nach außen nur auf bestimmte IPs (Netzbereiche) nicht zulassen.

                  Erzähl doch mal, von wo aus und über was für einen Internetzugang Du das ausprobierst.

                  Ich habe es vorhin von meinem DSL-Zugang per XAMPP ausprobiert.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Ja, ich habe Dein (korrigiertes) Script angewendet.
                    Ich verwende ebenfalls einen DSL-Anschluss mit Router (Leitung: Fernsehkabel). Über das Modem/Router laufen auch das Telefon und der
                    Fernseher. Die Website wird bei einem Bezahl-Hoster betrieben.

                    Mein äusserst bescheidenes Wissen (Erfahrung) sagt mir, dass das
                    Problem wohl beim Hosting liegt. Sprich der Time-Out ist zu eng
                    gesetzt. Wie schon erwähnt kann ich die php.ini frei konfigurieren.

                    Hilft Dir das weiter?

                    Rosa

                    1. Hello,

                      Ja, ich habe Dein (korrigiertes) Script angewendet.
                      Ich verwende ebenfalls einen DSL-Anschluss mit Router (Leitung: Fernsehkabel). Über das Modem/Router laufen auch das Telefon und der
                      Fernseher. Die Website wird bei einem Bezahl-Hoster betrieben.

                      Mein äusserst bescheidenes Wissen (Erfahrung) sagt mir, dass das
                      Problem wohl beim Hosting liegt. Sprich der Time-Out ist zu eng
                      gesetzt. Wie schon erwähnt kann ich die php.ini frei konfigurieren.

                      Hilft Dir das weiter?

                      Nein, nicht wirklich.
                      Die Firewalleinstellungen Deines Hosters kenne ich ja nicht.

                      Wenn meine beiden Scripte bei dem auch nicht laufen und auch dieses Timeout liefern, stimmt an der Firewall etwas nicht. Wenn es an 'allow_url_fopen' liegen würde, würde PHP Dir eine Fehlermeldung um die Ohren knallen. Fehlermeldungen hast Du doch aktiviert?

                      Probier doch mal ein einfaches file_get_contents() auf die URL. Funktioniert das? Oder liedert das auch ein Timeout. Übrigens sollte ein Timeout von ca. 50ms über DSL vollkommen ausreichend sein, um ein Socket aufzubauen.

                      Hast Du einen Xampp auf Deinem Host zuhause installiert?
                      Dann versuche es mal mit dem.
                      Du solltest nämlich erstmal ausschließen, dass Du einen Programmierfehler gemacht hast.

                      Liebe Grüße aus dem schönen Oberharz

                      Tom vom Berg

                      --
                       ☻_
                      /▌
                      / \ Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de
                      1. Fehlermeldungen sind aktiviert: error_reporting(E_ALL);

                        Hier noch die genaue Fehlermeldung zum ersten (langen) Script:
                        Warning: fsockopen() [function.fsockopen]: unable to connect to www.ambassadorhotel.ch:80 (Connection timed out) in

                        Ein einfaches file_get_contents gibt ebenfalls kein Resultat zurück.
                        (Mit und ohne Scheme) Es erscheint auch keine Fehlermeldung.

                        Ein Xampp habe ich leider nicht.

                        1. Hello,

                          Fehlermeldungen sind aktiviert: error_reporting(E_ALL);

                          Hier noch die genaue Fehlermeldung zum ersten (langen) Script:
                          Warning: fsockopen() [function.fsockopen]: unable to connect to www.ambassadorhotel.ch:80 (Connection timed out) in

                          Ein einfaches file_get_contents gibt ebenfalls kein Resultat zurück.
                          (Mit und ohne Scheme) Es erscheint auch keine Fehlermeldung.

                          Dann ist es mMn ein Firewall-Problem. Wenn outgoing http-requests bei Deinem Hoster gestattet sind, dann sprich ihn an, dass sie aber leider nicht funktionieren.

                          Ich erinnere mich dunkel, dass wir hier neulich schon mal jemanden hatten, der das gleiche oder zumindest ein ähnliches Problem hatte. Ich weiß jetzt nicht mehr, ob der es gelöst hat. Aber Du solltest mal suchen in den aktiven Threads und im Archiv. Ist höchstens acht Wochen her...

                          Es ist auch nicht ganz unmöglich, dass die Firewall des Ambassador dicht gemacht hat für Requests von Deiner IP beim Hoster, wenn Du nämlich (mehrfach) mit fehlerhaften Headern oder einem augenscheinlich gefälschten Request zugelangt hast. Z.B. Google hat solche Tools installiert. Warum sollten Andere sowas nicht verwenden?

                          Bekommst Du das Ganze denn noch per Firefox von Deinem Heim-PC?
                          Hast Du dir das plug-in "Live HTTP Headers" installiert?

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

                          --
                           ☻_
                          /▌
                          / \ Nur selber lernen macht schlau
                          http://bergpost.annerschbarrich.de
                          1. Bekommst Du das Ganze denn noch per Firefox von Deinem Heim-PC?
                            Hast Du dir das plug-in "Live HTTP Headers" installiert?

                            Mit dem FF funktionieren die Scripts nicht. Jedoch kriege ich mit dem Plug-in die Infos.

                            1. Hello,

                              Bekommst Du das Ganze denn noch per Firefox von Deinem Heim-PC?
                              Hast Du dir das plug-in "Live HTTP Headers" installiert?

                              Mit dem FF funktionieren die Scripts nicht.

                              Ja nee is schon klar ;-P

                              Jedoch kriege ich mit dem Plug-in die Infos.

                              So war es gemeint.
                              Das nützt Dir dann vermutlich nichts für die Aufgabe, aber es zeigt doch, dass der Zielhost mitspeilen mag. Und da ich die Response per Xampp von hier aus auch bekomme, scheint der Zielhost wohl nicht der Schuldige zu sein.

                              Also schieb Deinen Hoster an.

                              Liebe Grüße aus dem schönen Oberharz

                              Tom vom Berg

                              --
                               ☻_
                              /▌
                              / \ Nur selber lernen macht schlau
                              http://bergpost.annerschbarrich.de
                2. Hello Rosa,

                  also get_headers() funktioniert bei mir auch einwandfrei.

                  -----------------------------------------------
                  <?php   ### get_headers.php ###

                  get headers of response

                  $host = "www.ambassadorhotel.ch";
                      $scheme = 'http://';

                  $_response = get_headers($scheme.$host, 1);

                  echo "<pre>\r\n";
                      echo htmlspecialchars(print_r($_response,1));
                      echo "</pre>\r\n";
                  ?>
                  -----------------------------------------------

                  ergibt:

                  Array
                  (
                      [0] => HTTP/1.1 200 OK
                      [Date] => Tue, 11 Jan 2011 21:41:30 GMT
                      [Server] => Apache/2.2.3 (CentOS)
                      [X-Powered-By] => PHP/5.1.6
                      [Set-Cookie] => PHPSESSID=jqci8q3omqe8snpatj0gbg98g3; path=/
                      [Expires] => Thu, 19 Nov 1981 08:52:00 GMT
                      [Cache-Control] => no-store, no-cache, must-revalidate, post-check=0, pre-check=0
                      [Pragma] => no-cache
                      [Connection] => close
                      [Content-Type] => text/html
                  )

                  Ich hatte das vorhin ja schon mal gefragt: Hast Du vielleicht vergessen, das Scheme anzugeben und nur den Hostnamen benutzt?

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Ich hatte das vorhin ja schon mal gefragt: Hast Du vielleicht vergessen, das Scheme anzugeben und nur den Hostnamen benutzt?

                    Vorheriges Script habe ich ohne das Scheme ausgeführt. Ansonsten kriege ich
                    die Fehlermeldung: Fehler: Unable to find the socket transport "http" - did you forget to enable it when you configured PHP? (1781059072)

                    Das neuste Script führt ebenfalls nicht zum Erfolg. Dort ist das Scheme von Dir ja vorhanden.

                    Danke für Deine unermüdliche Hilfe!!

                    Rosa

                    1. Hello,

                      Ich hatte das vorhin ja schon mal gefragt: Hast Du vielleicht vergessen, das Scheme anzugeben und nur den Hostnamen benutzt?

                      Vorheriges Script habe ich ohne das Scheme ausgeführt. Ansonsten kriege ich
                      die Fehlermeldung: Fehler: Unable to find the socket transport "http" - did you forget to enable it when you configured PHP? (1781059072)

                      Du hast doch aber gesagt, dass Du die Headers von anderen URLs bekommen hättest?
                      Wenn Du nun diese Fehlermeldung bekommst für den Wrapper-Support, dass kann das aber nicht geklappt haben.

                      Das Script mit fsockopen() gibt auch nur den Hostnamen an. Das Protokoll wird dann ja im Request-Header selber übermittelt.

                      bei get_headers() benötigst Du die Angabe des Schemes, weil die Funktion sonst ja nicht weiß, über welches Protokoll sie den Request aufbauen soll.

                      Liebe Grüße aus dem schönen Oberharz

                      Tom vom Berg

                      --
                       ☻_
                      /▌
                      / \ Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de
                      1. Das hier funktioniert einwandfrei (andere URL):

                        <?php
                        $homepage = file_get_contents('http://www.titlis.ch/');
                        echo $homepage;
                        ?>

                        1. mit fsockopen übrigens auch!

                          1. Hello,

                            mit fsockopen übrigens auch!

                            dann siehe meine Anmerkung in https://forum.selfhtml.org/?t=202688&m=1369438

                            Wie oft hast Du denn da schon erfolgreich zugegriffen, bis es dann nicht mehr funktioniert hat? Hat es denn überhaupt schon funktioniert?

                            Liebe Grüße aus dem schönen Oberharz

                            Tom vom Berg

                            --
                             ☻_
                            /▌
                            / \ Nur selber lernen macht schlau
                            http://bergpost.annerschbarrich.de
                            1. Nein, auf www.ambassadorhotel.ch hat es noch nie funktioniert.

                              Anmerkung: Werde morgen nochmals das Forum durchsuchen. Vielleicht kriege ich ja da einen Hinweis. Dass die Firewall der Ziel-Domain dicht macht glaube ich nich, da ich das Problem schon beim ersten Zugriff hatte.
                              Ich habe aber noch andere Domains, die ich nicht erreiche. Werde auch
                              noch die verschiedenen Scripts auf diesen anwenden.

                              1. Hello,

                                Nein, auf www.ambassadorhotel.ch hat es noch nie funktioniert.
                                Ich habe aber noch andere Domains, die ich nicht erreiche. Werde auch
                                noch die verschiedenen Scripts auf diesen anwenden.

                                Das deutet allerdings eher darauf hin, dass die Firewall DEINES Hosters misskonfiguriert ist. Das hatte ein Freund, der mehrere Dutzend Server bei Strato hatte, auf einem seiner Hosts auch mal, nachdem die da irgendwas geändert hatten. Das hat ihn richtig Kunden gekostet.

                                Da haben wir damals auch von allen anderen Hosts aus zugreifen können, nur von diesem einen gab es immer Probleme.

                                Liebe Grüße aus dem schönen Oberharz

                                Tom vom Berg

                                --
                                 ☻_
                                /▌
                                / \ Nur selber lernen macht schlau
                                http://bergpost.annerschbarrich.de
                                1. Das deutet allerdings eher darauf hin, dass die Firewall DEINES Hosters misskonfiguriert ist.

                                  BINGO! Dein Post hat mich auf die Idee gebracht, das Script bei meinen alten Hoster (von dem ich mich lösen will) laufen zu lassen. Und siehe da: Es funktioniert einwandfrei.

                                  Der alte Hoster hat aber auch irgendwie komische Einstellungen. Seit dem ich gezügelt habe, kommen plötzlich die Yahoo-Bots und viele weitere auf meine Domain.

                                  Vielen Dank nochmals für die Hilfe! Bin fast verzweifelt. Nun weiss ich, dass ich morgen mit meinem neuen Hoster sprechen muss.

                                  Guten Abend noch und liebe Grüsse
                                  Rosa

  2. Hello,

    Wie der Betreff schon sagt, versuche ich den Header (brauche nur den Server-Status) fremder URL's auslesen.

    Das funktioniert bei den meisten URL's auch. Nur zum Beispiel bei www.ambassadorhotel.ch nicht.

    Bei mir funktioniert das ganz hervorragend mittels FF-Extension 'Live HTTP Headers'
    Dann muss es mit anderen Clients auch funktionieren, auch wenn Du PHP als Client benutzt.

    ----------------------------------------------------------
    http://www.ambassadorhotel.ch/
    ----------------------------------------------------------
    GET / HTTP/1.1
    Host: www.ambassadorhotel.ch
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: de-de,de;q=0.8,en-us;q=0.6,en;q=0.4,fr-fr;q=0.2
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive

    HTTP/1.1 200 OK
    Date: Tue, 11 Jan 2011 15:41:10 GMT
    Server: Apache/2.2.3 (CentOS)
    X-Powered-By: PHP/5.1.6
    Set-Cookie: PHPSESSID=gnlk3cloige3kgjae20cme1065; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html
    ----------------------------------------------------------

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi!

      Wie der Betreff schon sagt, versuche ich den Header (brauche nur den Server-Status) fremder URL's auslesen.
      Das funktioniert bei den meisten URL's auch. Nur zum Beispiel bei www.ambassadorhotel.ch nicht.
      Bei mir funktioniert das ganz hervorragend mittels FF-Extension 'Live HTTP Headers'
      Dann muss es mit anderen Clients auch funktionieren, auch wenn Du PHP als Client benutzt.

      GET / HTTP/1.1
      Host: www.ambassadorhotel.ch
      User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
      [...]

      Das ist ja auch ein "vollständiger" Request. Ich hatte schonmal eine Seite, die wollte partout nicht antworten, wenn keine User-Agent-Zeile mitgesendet wurde. Das war auch meine erste Vermutung für diesen Fall. Ansonsten kann es nur irgendwas mit den Request-Headern sein, denn wenn der auch nur mit Wasser kochende Browser das hinbekommt, dann geht das auch zu Fuß, wenn man ähnliche Header wie ein Browser sendet.

      Lo!