volker2013: http header mit php auslesen

Hallo,

ich habe im folgenden PHP-Programm ein Problem mit Variablen. Es wäre nett, wenn mir jemand helfen könnte. Es gab einen ähnlichen Beitrag im Forum von 2011, wo ich auch das Script zum auslesen von HTTP-Header-Dateien gefunden habe.Vielen Dank an Tom! Allerdings kann man damit nur eine "fixe" URL auslesen. Also habe ich ein Startformular (url.php) angefertigt, wo man eine beliebige URl eintippen kann und diese dann an ein zweites Formular (empfangeURL.php) gesendet werden soll. Dieses zweite Formular macht dann die Auswertung und zeigt mir die Headerinformationen an. Wahrscheinlich habe ich einen Fehler mit der Variablen $url oder REQUEST gemacht. Hat jemand eine Idee?

Hie der Code:

url.php

<table width="65%" border="0" align="center" cellpadding="1" cellspacing="1">
  <tr bgcolor="#DFDFFF">

<td> <form name="Form" method="post" action="empfangeURL.php">

<p>URL:
          <input name="url" type="text" value="http://">

</p>
        <p>
          <input type="submit" name="Submit" value="Senden">
          <input type="reset" name="Submit2" value="Reset">
        </p>
      </form>
      &nbsp;</td>
  </tr>
</table>

-------------------------------------------------------------------------

empfangeURL.php

<title>Empfangen</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?
   # get headers of response

$url    = $_REQUEST[url];
    $scheme = 'http://';

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

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

Mit freundlichen Grüssen
Volker

  1. Tach!

    ich habe im folgenden PHP-Programm ein Problem mit Variablen. Es wäre nett, wenn mir jemand helfen könnte.

    Es wäre nett, wenn du das Problem mal schildern könntest. Am besten aber, du beschreibst mal dein Ziel.

    Wahrscheinlich habe ich einen Fehler mit der Variablen $url oder REQUEST gemacht. Hat jemand eine Idee?

    Was ergaben denn deine Debug-Versuche? Was zeigt var_dump() an? Gibt es Meldungen bei auf E_ALL gestelltem error_reporting?

    <table width="65%" border="0" align="center" cellpadding="1" cellspacing="1">
      <tr bgcolor="#DFDFFF">

    Für das Problem nicht relavanten Code kannst du weglassen, wie zum Beispiel diese Layout-Tabelle. Sonst analysieren die Helfer den Code und das unnötigerweise.

    <form name="Form" method="post" action="empfangeURL.php">
              <input name="url" type="text" value="http://">
              <input type="submit" name="Submit" value="Senden">
          </form>

    Das wäre der interessante Teil gewesen. Und für den Test hätte auch eine im Code stehende URL genügt.

    $url    = $_REQUEST[url];
        $scheme = 'http://';
        $_response = get_headers($scheme.$url, 1);

    Schau mal nach, was in den Variablen drinsteht. Zum Beispiel könnte die URL nicht stimmen. Das kann ich aber aus der Ferne nicht sehen, weil ich nicht weiß, was du in dein Formular eingibst.

    dedlfix.

    1. N'abend!

      Tach!

      ich habe im folgenden PHP-Programm ein Problem mit Variablen. Es wäre nett, wenn mir jemand helfen könnte.

      Es wäre nett, wenn du das Problem mal schildern könntest. Am besten aber, du beschreibst mal dein Ziel.

      Formular 1: Webadresse eintippen: zum Bsp.: http://www.ard.de
      Formular 2: Gibt den HTTP Header aus

      Das Problem ist: Formular 2 zeigt den Header nicht an. Daher die Vermutung, dass etwas mit den Variablen nicht stimmt.

      Wahrscheinlich habe ich einen Fehler mit der Variablen $url oder REQUEST gemacht. Hat jemand eine Idee?

      Was ergaben denn deine Debug-Versuche? Was zeigt var_dump() an? Gibt es Meldungen bei auf E_ALL gestelltem error_reporting?

      Nein, habe ich noch nicht gemacht.

      <table width="65%" border="0" align="center" cellpadding="1" cellspacing="1">
        <tr bgcolor="#DFDFFF">

      Für das Problem nicht relavanten Code kannst du weglassen, wie zum Beispiel diese Layout-Tabelle. Sonst analysieren die Helfer den Code und das unnötigerweise.

      <form name="Form" method="post" action="empfangeURL.php">
                <input name="url" type="text" value="http://">
                <input type="submit" name="Submit" value="Senden">
            </form>

      Das wäre der interessante Teil gewesen. Und für den Test hätte auch eine im Code stehende URL genügt.

      Mit einer URL im Code funktioniert das zweite Formular. Das Ziel ist ja, dass man eine URL in das erste Formular eintippt und diese dann angezeigt wird.

      $url    = $_REQUEST[url];
          $scheme = 'http://';
          $_response = get_headers($scheme.$url, 1);

      Schau mal nach, was in den Variablen drinsteht. Zum Beispiel könnte die URL nicht stimmen. Das kann ich aber aus der Ferne nicht sehen, weil ich nicht weiß, was du in dein Formular eingibst.

      dedlfix.

      Vielen Dank für die Orientierung.

      1. Hallo,

        Formular 1: Webadresse eintippen: zum Bsp.: http://www.ard.de

        Fehler: Der abschließende Slash fehlt.

        <input name="url" type="text" value="http://">

        Hier animierst du die Nutzer, die URL "ordentlich" mit dem Präfix "http://" einzugeben. Gut, warum nicht.

        $url    = $_REQUEST[url];
            $scheme = 'http://';
            $_response = get_headers($scheme.$url, 1);

        Und hier hängst du nochmal ein "http://" davor, ohne zu prüfen, ob das in der Eingabe nicht schon enthalten ist. Letztendlich versuchst du womöglich, die Response Header von http;//http://example.org/ zu lesen, was natürlich fehlschlagen wird.

        Ciao,
         Martin

        --
        Der Alptraum jedes Computers:
        "Mir war, als hätte ich gerade eine 2 gesehen."
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo,

          Formular 1: Webadresse eintippen: zum Bsp.: http://www.ard.de

          Fehler: Der abschließende Slash fehlt.

          <input name="url" type="text" value="http://">

          Hier animierst du die Nutzer, die URL "ordentlich" mit dem Präfix "http://" einzugeben. Gut, warum nicht.

          $url    = $_REQUEST[url];
              $scheme = 'http://';
              $_response = get_headers($scheme.$url, 1);

          Und hier hängst du nochmal ein "http://" davor, ohne zu prüfen, ob das in der Eingabe nicht schon enthalten ist. Letztendlich versuchst du womöglich, die Response Header von http;//http://example.org/ zu lesen, was natürlich fehlschlagen wird.

          Ciao,
          Martin

          Hallo Martin,

          vielen Dank!!! Genau das wars. Manchmal sieht man den Wald vor lauter Bäumen nicht. rrrsss
          Das mit dem Slash ist schon heftig. Ich werde mal versuchen, dass die Syntaxe beim Eintippen überprüft wird.
          Nochmals, vielen Dank an Euch!

          Viel Grüsse aus Brasilien
          Volker

          1. Tach!

            Formular 1: Webadresse eintippen: zum Bsp.: http://www.ard.de
            Fehler: Der abschließende Slash fehlt.

            Die URL ist zwar syntaktisch nicht vollständig, aber in diesem Fall ist das egal. Sie wird ja nicht verwendet, um relative Links zu vervollständigen. Für den Request wird sie sowieso in ihre Einzelteile zerlegt werden. Da HTTP-Requests ohne Pfad nicht gültig sind, beziehungsweise immer einen absoluten Pfad, also mit / vorndran benötigt wird, und damit mindestens ein
              GET / HTTP/1.1
            gesendet werden muss, muss und kann auch problemlos sich derjenige um eine Fehlerkorrektur kümmern, der den HTTP-Request absetzt, hier also die Funktion get_headers(), oder was auch immer sie für die Ausführung aufruft.

            Hier animierst du die Nutzer, die URL "ordentlich" mit dem Präfix "http://" einzugeben. Gut, warum nicht.
            Und hier hängst du nochmal ein "http://" davor, ohne zu prüfen, ob das in der Eingabe nicht schon enthalten ist. Letztendlich versuchst du womöglich, die Response Header von http;//http://example.org/ zu lesen, was natürlich fehlschlagen wird.
            vielen Dank!!! Genau das wars. Manchmal sieht man den Wald vor lauter Bäumen nicht. rrrsss

            Deswegen ist die erste Amtshandlung bei Fehlern ja auch, sich die Inhalte der beteiligten Variablen anzuschauen, damit man solche Unstimmigkeiten gleich präsentiert bekommt und erkenenn kann. Wild rumraten hilft meist wenig.

            Das mit dem Slash ist schon heftig. Ich werde mal versuchen, dass die Syntaxe beim Eintippen überprüft wird.

            Du kannst das nicht wirklich überprüfen. Bei URLs ohne Pfadangabe kümmert sich zwangsläufig der HTTP-Request-Ersteller drum. Da könntest du einen dransetzen, aber da ist es nicht notwendig, weil es sowieso unbedingt korrigiert werden muss. Hast du allerdings einen nichtleeren Pfad, woher soll dann das Script wissen, ob der Slash nun drangehört oder nicht? Es gibt dazu keine Regel, man kann das nicht aus der URL ableiten. Hier kann nur der Server einen Redirekt zu einem Pfad mit / hintendran schicken, wenn er feststellt, dass ohne diesen Slash relative Links in der ausgelieferten Ressource zu falsch aufgelösten absoluten Pfaden führen würden.

            dedlfix.

          2. Hello Volker,

            [...]

            Und hier hängst du nochmal ein "http://" davor, ohne zu prüfen, ob das in der Eingabe nicht schon enthalten ist. Letztendlich versuchst du womöglich, die Response Header von http;//http://example.org/ zu lesen, was natürlich fehlschlagen wird.

            vielen Dank!!! Genau das wars. [...]

            Es lohnt sich wirklich, sich eine kleine Funktionsbibliothek zur Normalisierung von Eingaben zu bauen. PHP bietet dafür schon eine Reihe von Funktionen unter
            [http://de3.php.net/manual/en/book.filter.php]

            Aber die sind zum Teil noch recht kompliziert zu verstehen.

            Wenn Du dir aber für alle seiner Usereingaben immer erstmal selber eine Filterfunktion überlegst für die _Normalisierung_ der erwarteten Daten, nicht für dir kolonisierung des Users, dann weißt Du auch, was passieren soll und wirst keine Scheu mehr davor haben, Eingabedaten erst einmal zu normalisieren, denn Du hast dann ja eine fertige Funktion :-)

            Ob die eigenen Funktionen dann durch die durchaus schlauen PHP-eigenen ersetzt werden können, wäre der nächste Schritt.

            Und beachte immer:

            <strong style="color:red">Usereingaben sind immer böse!</strong>

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://restaurant-zur-kleinen-kapelle.de
            1. Hello Volker,

              [...]

              Und hier hängst du nochmal ein "http://" davor, ohne zu prüfen, ob das in der Eingabe nicht schon enthalten ist. Letztendlich versuchst du womöglich, die Response Header von http;//http://example.org/ zu lesen, was natürlich fehlschlagen wird.

              vielen Dank!!! Genau das wars. [...]

              Es lohnt sich wirklich, sich eine kleine Funktionsbibliothek zur Normalisierung von Eingaben zu bauen. PHP bietet dafür schon eine Reihe von Funktionen unter
              [http://de3.php.net/manual/en/book.filter.php]

              Aber die sind zum Teil noch recht kompliziert zu verstehen.

              Wenn Du dir aber für alle seiner Usereingaben immer erstmal selber eine Filterfunktion überlegst für die _Normalisierung_ der erwarteten Daten, nicht für dir kolonisierung des Users, dann weißt Du auch, was passieren soll und wirst keine Scheu mehr davor haben, Eingabedaten erst einmal zu normalisieren, denn Du hast dann ja eine fertige Funktion :-)

              Ob die eigenen Funktionen dann durch die durchaus schlauen PHP-eigenen ersetzt werden können, wäre der nächste Schritt.

              Und beachte immer:

              <strong style="color:red">Usereingaben sind immer böse!</strong>

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              Hallo Tom,

              Nochmals vielen Dank. Ich werde mich mal mit den Filtern beschäftigen. Das klingt sehr interessant.

              Mein nächstes Ziel ist es erst einmal die ausgelesenen Headerinformationen mit Unterstützung von CSS anzuzeigen. Das heißt, dass Ausgabeformular in die Startseite zu integrieren.

              Alles Gute
              Volker

              1. Hallo,

                Nochmals vielen Dank. Ich werde mich mal mit den Filtern beschäftigen. Das klingt sehr interessant.

                und lass in Zukunft bitte die Vollzitate (TOFU) bleiben. Das stört und bringt keinen Mehrwert. Zitiere selektiv das, worauf du dich konkret beziehst, und lass den Rest weg. Danke.

                So long,
                 Martin

                --
                Die beste Informationsquelle sind Leute, die jemand anderem versprochen haben, nichts weiterzuerzählen.
                  (alte Journalistenweisheit)
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    2. Hello,

      <form name="Form" method="post" action="empfangeURL.php">
                <input name="url" type="text" value="http://">
                <input type="submit" name="Submit" value="Senden">
            </form>

      Das wäre der interessante Teil gewesen. Und für den Test hätte auch eine im Code stehende URL genügt.

      $url    = $_REQUEST[url];

      und man sollte nicht darauf verzichten, den Elementbezeichner ['url'] auch als String zu verpacken, damit PHP nicht eigenmächtig einen Konstantenbezeichner daraus macht, der dann vielleicht zufällig sogar vorhanden ist...

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://restaurant-zur-kleinen-kapelle.de
      1. Hello,

        <form name="Form" method="post" action="empfangeURL.php">
                  <input name="url" type="text" value="http://">
                  <input type="submit" name="Submit" value="Senden">
              </form>

        Das wäre der interessante Teil gewesen. Und für den Test hätte auch eine im Code stehende URL genügt.

        $url    = $_REQUEST[url];

        und man sollte nicht darauf verzichten, den Elementbezeichner ['url'] auch als String zu verpacken, damit PHP nicht eigenmächtig einen Konstantenbezeichner daraus macht, der dann vielleicht zufällig sogar vorhanden ist...

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        Hallo Tom,

        vielen Dank für deine Erläuterungen und Tipps. Bezüglich Elemtbezeichner als String verpacken, meinst du das:

        $url    = $_REQUEST[textURL];

        Alles Gute
        Volker

        1. Hallo

          und man sollte nicht darauf verzichten, den Elementbezeichner ['url'] auch als String zu verpacken, …

          vielen Dank für deine Erläuterungen und Tipps. Bezüglich Elemtbezeichner als String verpacken, meinst du das:

          $url    = $_REQUEST[textURL];

          Nein, er meint, was er schrieb, nämlich das oben gzu sehende ['url'] (wichtig: die Anführungszeichen um die Zeichenkette für den Namen des Arrayelements).

          Tschö, Auge

          --
          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
          Terry Pratchett, "Wachen! Wachen!"
          ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
          Veranstaltungsdatenbank Vdb 0.3
  2. Hallo,

    ich habe da noch eine Frage zu folgenden Kommando:

    echo htmlspecialchars(print_r($_response,1));

    Die Ausgabe zeigt Arrays an. Ist es möglich, die Ausgabe mit einer externen CSS-Datei zu verändern. Ich meine stylistisch, Farbe, Schriftart und so weiter. Müsste man dazu vielleicht zuerst die Informationen in eine Logdatei umleiten?

    Mit freundlichen Grüssen
     Volker

    1. Tach!

      echo htmlspecialchars(print_r($_response,1));
      Die Ausgabe zeigt Arrays an. Ist es möglich, die Ausgabe mit einer externen CSS-Datei zu verändern. Ich meine stylistisch, Farbe, Schriftart und so weiter. Müsste man dazu vielleicht zuerst die Informationen in eine Logdatei umleiten?

      print_r() und var_dump() sind vorwiegend zum Debugging gedacht. Wenn du eine brauchbare Ausgabe haben möchtest, dann lauf mit foreach durch und schreib die Array-Inhalte in passende HTML-Elemente. Eine Tabelle zum Beispiel, links die Namen, rechts die Werte.

      dedlfix.

      1. print_r() und var_dump() sind vorwiegend zum Debugging gedacht. Wenn du eine brauchbare Ausgabe haben möchtest, dann lauf mit foreach durch und schreib die Array-Inhalte in passende HTML-Elemente. Eine Tabelle zum Beispiel, links die Namen, rechts die Werte.

        dedlfix.

        Dank dir. Das ist genau was ich gesucht habe.

        Alles Gute