Ben: $_SERVER['HTTP_REFERRER'] funktioniert nicht

Hallo,

ich habe in meiner .htaccess die normale 404-Seite durch ein Php-Script ersetzt. Dieses gibt die Fehlermeldung aus und sendet mir im Hintergrund eine eMail mit einer Benachrichtigung. Diese soll dann den HTTP_REFERRER enthalten, damit ich wenigstens weiß, auf welcher Seite ich nach dem Deadlink suchen muss.

mail("info@typeworX.de","Deadlink","Auf dieser Seite befindet sich ein toter Link: ".$_SERVER['HTTP_REFERRER']."","From: info@typeworX.de");

Die eMail kommt an, der Text steht drin, aber kein Wort vom  Referrer.

Wo liegt mein Fehler?

Vielen Dank im Voraus und viele Grüße
Ben

  1. Hi,

    Die eMail kommt an, der Text steht drin, aber kein Wort vom  Referrer.
    Wo liegt mein Fehler?

    Du gehst davon aus, daß der Referrer immer mitgesendet wird.
    Aber der Referrer ist kein Pflichtfeld...

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    1. Hallo Andreas,

      muss ich also ein hidden-input schreiben, in das der Referrer automatisch geschrieben wird? Dann werde ich das mal versuchen.

      Oder gibt es da nur eine andere Lösung, die ich gerade nicht sehe?

      Danke und viele Grüße
      Ben

      1. Hi,

        Oder gibt es da nur eine andere Lösung, die ich gerade nicht sehe?

        Ich würde zumindest REQUEST_URI ausgeben, dann weißt Du wenigstens, was nicht gefunden wurde.

        Den Referrer kannst Du ja zusätzlcih ausgeben - wenn er gesetzt ist, ist gut, wenn nicht, verlierst Du ja nichts dabei...

        Ach ja, der Gedanke, daß jeder 404 auf einem kaputten Link basiert, ist sowieso verkehrt.
        Kann ja auch jemand ne falsche Url von Hand eingetippt haben.

        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        1. Hi Andreas,

          Ich würde zumindest REQUEST_URI ausgeben, dann weißt Du wenigstens, was nicht gefunden wurde.

          Ja, werde ich jetzt auch schon wegen des Postings von Alexander mal testen.

          Ach ja, der Gedanke, daß jeder 404 auf einem kaputten Link basiert, ist sowieso verkehrt.
          Kann ja auch jemand ne falsche Url von Hand eingetippt haben.

          Ja, natürlich. Wenn es sich jedoch um einen Deadlink handelt, so kann ich so natürlich einfacher finden, nichtwahr? :-)

          Danke und viele Grüße
          Ben

          1. Hallo Ben,

            ich find da im übrigen eine gute Idee, überhaupt an solche Sachen zu denken. Ist immer noch besser, als die Kiste vor sich hin schimmeln zu lassen.

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
            1. Hi Tom,

              ich find da im übrigen eine gute Idee, überhaupt an solche Sachen zu denken. Ist immer noch besser, als die Kiste vor sich hin schimmeln zu lassen.

              Freut mich. :-) Immerhin will ich nicht wochenlang unbemerkt tote Links auf der Seite haben, denn sowas kann verdammt unprofessionell wirken, denke ich.

              Viele Grüße
              Ben

        2. Hallo Andreas,

          Ach ja, der Gedanke, daß jeder 404 auf einem kaputten Link basiert, ist sowieso verkehrt.
          Kann ja auch jemand ne falsche Url von Hand eingetippt haben.

          Aber genau dann ist der Referrer, also $_SERVER[HTTP_REFERER], leer. Natürlich nur, wenn nicht faked wurde.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
  2. Moin Moin !

    Du mußt nicht den REFERER auswerten. Es gibt (mind. beim Apache) eine andere Variable (ist mir gerade entfalle, vielleicht REQUEST_URI ???), die Dir sagt, was der User wirklich haben wollte. Laß Dir einfach mal alle Variablen ausgeben.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    1. Hi Alexander

      Du mußt nicht den REFERER auswerten. Es gibt (mind. beim Apache) eine andere Variable (ist mir gerade entfalle, vielleicht REQUEST_URI ???), die Dir sagt, was der User wirklich haben wollte. Laß Dir einfach mal alle Variablen ausgeben.

      Vielleicht stell ich mich jetzt gerade etwas doof an, aber wie meinst du das, dass ich mir alle Variablen ausgeben lassen soll?

      Danke und viele Grüße
      Ben

      1. Hi,

        Vielleicht stell ich mich jetzt gerade etwas doof an, aber wie meinst du das, dass ich mir alle Variablen ausgeben lassen soll?

        phpinfo();
        bzw.
        phpinfo(INFO_VARIABLES);
        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
  3. Hallo Ben,

    ich habe in meiner .htaccess die normale 404-Seite durch ein Php-Script ersetzt. Dieses gibt die Fehlermeldung aus und sendet mir im Hintergrund eine eMail mit einer Benachrichtigung. Diese soll dann den HTTP_REFERRER enthalten, damit ich wenigstens weiß, auf welcher Seite ich nach dem Deadlink suchen muss.

    du solltest dich aber nicht darauf verlassen, dass HTTP_REFERER mitgesendet wird (mein opera sendet keinen). Du solltest zumindest $_SERVER["REQUEST_URI"] mitsenden, danach kannst du dann suchen, wenn HTTP_REFERER leer ist.

    mail("info@typeworX.de","Deadlink","Auf dieser Seite befindet sich ein toter Link: ".$_SERVER['HTTP_REFERRER']."","From: info@typeworX.de");

    das ist ein 'R' zu viel drin, es muss $_SERVER["HTTP_REFERER"] heißen. Außerdem kannst du dir den Punkt und die zwei Anführungszeichen nach der eckigen Klammer sparen.

    Grüße aus Nürnberg
    Tobias

    1. Hi Tobias

      das ist ein 'R' zu viel drin, es muss $_SERVER["HTTP_REFERER"] heißen. Außerdem kannst du dir den Punkt und die zwei Anführungszeichen nach der eckigen Klammer sparen.

      Das werde ich natürlich verbessern. Heißt es in JS vielleicht referrer? Irgendwie hab ich die ganze Zeit diese zwei R im Kopf gehabt... seltsam. Danke! :-)

      Viele Grüße
      Ben

      PS: Werde einfach den REFERER und die REQUEST_URI übergeben, so bin ich hoffentlich gut bedient.

      1. Hallo Ben,

        das ist ein 'R' zu viel drin, es muss $_SERVER["HTTP_REFERER"] heißen. Außerdem kannst du dir den Punkt und die zwei Anführungszeichen nach der eckigen Klammer sparen.

        Das werde ich natürlich verbessern. Heißt es in JS vielleicht referrer? Irgendwie hab ich die ganze Zeit diese zwei R im Kopf gehabt... seltsam. Danke! :-)

        <script type="text/javascript">
        <!--
         document.write("<h1>Lieber Besucher</h1>");
         document.write("Du hast also von " + document.referrer + " hierher gefunden");
        //-->
        </script>

        Wie du siehst, sit es so. Ungefähr in dieser Qualität und homogenität ist scheinbar alle Software rund um HTTP & Co. geschrieben. Da gibts noch mehr Fälle.

        BTW: kann mir jemand die Funktion oder Mehtode in JavaScript nennen, mit der man das schreibbare Zeichen zum ASCCI-Code bekommt? chr() oder char() gibts ja nicht.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
        1. Hallo

          BTW: kann mir jemand die Funktion oder Mehtode in JavaScript nennen, mit der man das schreibbare Zeichen zum ASCCI-Code bekommt? chr() oder char() gibts ja nicht.

          hm? mit Chr() o.Ä. bekommst du doch das entsprechende Zeichen aus dem ASCII-Code (<- einfach-C, doppel-I)... Und wie ich das _zum_ ASCII-Code bekommen verstehe, meinst du eher sowas wie ord() (Delphi) oder Asc() Basic.
          Diese Funktionen denke suchst du also:
          http://selfhtml.teamone.de/javascript/objekte/unabhaengig.htm#encode_uri (Zeichen zu Zahl)
          http://selfhtml.teamone.de/javascript/objekte/unabhaengig.htm#decode_uri (Zahl zu Zeichen)

          Grüße

          David

          --
          "Nobody will ever need more than 640k RAM!"
          1981 Bill Gates
          1. Hallo,

            BTW: kann mir jemand die Funktion oder Mehtode in JavaScript nennen, mit der man das schreibbare Zeichen zum ASCCI-Code bekommt? chr() oder char() gibts ja nicht.
            hm? mit Chr() o.Ä. bekommst du doch das entsprechende Zeichen aus dem ASCII-Code

            ich meiten schon chr() und ord()

            aber in JavaScript bin ich entweder zu blöd die zu finden, oder es gibt sie nicht. Ich habe mich jetzt immer mit

            String.fromCharCode(65,66,67);

            beholfen. Das kanns doch aber nicht sein, oder?

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
            1. Moin!

              aber in JavaScript bin ich entweder zu blöd die zu finden, oder es gibt sie nicht. Ich habe mich jetzt immer mit

              String.fromCharCode(65,66,67);

              beholfen. Das kanns doch aber nicht sein, oder?

              Doch. Das ist schließlich die Funktion, die einen Zahlenwert in das zugehörige Zeichen wandelt. Welche andere Funktion sollte es deiner Meinung nach geben, die dasselbe macht? Immerhin hast du hier sogar den Komfort, gleich mehrere Zahlenwerte in eine einzelne Zeichenkette umzuwandeln.

              - Sven Rautenberg

              --
              "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
              1. Hallöle nochmal,

                das beruhigt mich, dass Du auch keine andere kennst. Ich war fest der Meinung, mit char() gearbeitet zu haben. Aber dann war das wohl für ASP in Visual basic. Ich bring langsam alles durcheinander *g*

                Liebe Grüße aus http://www.braunschweig.de

                Tom

                --
                Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
      2. Moin!

        Das werde ich natürlich verbessern. Heißt es in JS vielleicht referrer? Irgendwie hab ich die ganze Zeit diese zwei R im Kopf gehabt... seltsam. Danke!

        Du liegst nicht ganz falsch. Die korrekte englische Bezeichnung und Schreibweise ist "Referrer". Nur dummerweise hat irgendwer, als er den ersten HTTP-Standard geschrieben hat, bei dem Wort "Referrer" einen Tippfehler eingebaut und "Referer" draus gemacht. Dummerweise hat wohl niemand mehr korrekturgelesen, oder es ist niemandem aufgefallen, und so steht im Standard eben, dass der Browser einen "Referer" im HTTP-Header senden kann.

        Niemand konnte oder wollte den Tippfehler noch korrigieren, als Entwickler die ersten Browser fertiggestellt hatten. Und so leben wir jetzt mit diesem Tippfehler und werden verwirrt. :)

        Nebenbei: Es ist, wenn du irgendeine Information, die eigentlich da sein müsste, immer eine gute Idee, die entsprechende Variable mal komplett zu dumpen:
        print_r($variable); oder
        var_dump($variable); oder für alle $_*-Variablen
        php_info(INFO_VARIABLES);
        Dann siehst du, was wirklich drinsteht, inklusive aller Indices, die existieren, und dir wäre dein Fehler sofort aufgefallen. Vor allem bei phpinfo() kann man prima Copy&Paste den Variablennamen der gewünschten Information in das eigene Skript übertragen.

        - Sven Rautenberg

        --
        "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
        1. Hallo Sven,

          Nebenbei: Es ist, wenn du irgendeine Information, die eigentlich da sein müsste, immer eine gute Idee, die entsprechende Variable mal komplett zu dumpen:
          print_r($variable); oder
          var_dump($variable); oder für alle $_*-Variablen
          php_info(INFO_VARIABLES);
          Dann siehst du, was wirklich drinsteht, inklusive aller Indices, die existieren, und dir wäre dein Fehler sofort aufgefallen. Vor allem bei phpinfo() kann man prima Copy&Paste den Variablennamen der gewünschten Information in das eigene Skript übertragen.

          Hat Du einen Tipp für print_r($GLOBALS)? Das sollte man ja nicht schreiben, wegen Selbstbezug und damit Rekursion. Hab ich immer noch auf meiner Liste stehen, dass ich dafür mal einen sinnvollen Ersatz finden wollte.

          - Sven Rautenberg

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
          1. Moin!

            Hat Du einen Tipp für print_r($GLOBALS)? Das sollte man ja nicht schreiben, wegen Selbstbezug und damit Rekursion. Hab ich immer noch auf meiner Liste stehen, dass ich dafür mal einen sinnvollen Ersatz finden wollte.

            In der Regel interessieren zum Debugging nicht _alle_ globalen Variablen, sondern nur die, die man gerade benutzt. Da kann man mit Einzel-Dumps IMHO besser fahren, als sämtliche Variablen auszugeben.

            Aber es gibt natürlich Mittel und Wege, eine eigene Funktion zum Dumpen zu schreiben. Die User-Kommentare zu var_dump und print_r sind voll davon.

            Außerdem existiert dein Problem der Rekursion angeblich sein PHP 4.0.4 nicht mehr. Da dieser Hinweis nur bei print_r steht, nehme ich an, dass var_dump gar nicht rekursiv vorgeht.

            - Sven Rautenberg

            --
            "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
            1. Hi Sven,

              Außerdem existiert dein Problem der Rekursion angeblich sein PHP 4.0.4 nicht mehr. Da dieser Hinweis nur bei print_r steht, nehme ich an, dass var_dump gar nicht rekursiv vorgeht.

              A     H     H     A
                                               A A    H     H    A A
                                              A A A   H H H H   A A A
                                             A     A  H     H  A     A
                                            A       A H     H A       A

              und danke, das wird sofort getestet.

              Liebe Grüße aus http://www.braunschweig.de

              Tom

              --
              Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
        2. Hi Sven,

          Du liegst nicht ganz falsch. Die korrekte englische Bezeichnung und Schreibweise ist "Referrer". Nur dummerweise hat irgendwer, als er den ersten HTTP-Standard geschrieben hat, bei dem Wort "Referrer" einen Tippfehler eingebaut und "Referer" draus gemacht. Dummerweise hat wohl niemand mehr korrekturgelesen, oder es ist niemandem aufgefallen, und so steht im Standard eben, dass der Browser einen "Referer" im HTTP-Header senden kann.

          Das beruhigt mich doch sehr, da hat sich der Englisch-LK ja gelohnt. ;-)

          Nebenbei: Es ist, wenn du irgendeine Information, die eigentlich da sein müsste, immer eine gute Idee, die entsprechende
          Variable mal komplett zu dumpen:
          print_r($variable); oder
          var_dump($variable); oder für alle $_*-Variablen
          php_info(INFO_VARIABLES);
          Dann siehst du, was wirklich drinsteht, inklusive aller Indices, die existieren, und dir wäre dein Fehler sofort
          aufgefallen. Vor allem bei phpinfo() kann man prima Copy&Paste den Variablennamen der gewünschten Information in das
          eigene Skript übertragen.

          Den Tipp habe ich nun öfter bekommen und werde das beim nächsten Mal auch erstmal versuchen.

          Vielen Dank und viele Grüße
          Ben