Daniela: Kurze Frage zu Http_Referer !

Hi !

Leider suche ich schon lange nach einer Möglichkeit ein Referrer bei nicht vorhanden sein oder Suchmaschinen zu Blocken und damit nicht in einem Loggfile zu Speichern.

Habe mir das so gedacht nur leider Funktioniert es nicht.

$from = $HTTP_REFERER;
if (stristr($HTTP_REFERER, "http://www.test.de") == $HTTP_REFERER);
if ($lange <91) {
for ($i = 1; $i <= (90-$lange); $i++) {
   $leer2= $leer2." ";
}
}

Kennst du eventuell eine andere Möglichkeit das nicht vorhandene Referer oder Suchmaschinen nicht geloggt werden ?

  1. Hallo Daniela,

    Leider suche ich schon lange nach einer Möglichkeit ein
    Referrer bei nicht vorhanden sein oder Suchmaschinen zu
    Blocken und damit nicht in einem Loggfile zu Speichern.

    Was genau meinst du damit?

    Kennst du eventuell eine andere Möglichkeit das nicht
    vorhandene Referer oder Suchmaschinen nicht geloggt
    werden?

    Was meinst du? Deine Frage ist nicht verstaendlich. Meinst du
    das Apache-Log? Das kannst du nicht beeinflussen.

    Gruesse,
     CK

    1. Hi !

      Nein ich speichere in einer *.txt Datei woher meine Besucher kommen nur bei Firewalls usw. kann kein Referer ermittelt werden.

      Außerdem möchte ich auch Suchmaschinen nicht loggen da der Logfile nach der Fertigstellung des Scriptes auf meiner Webseite angezeigt werden soll.

      1. Moin!

        Hi !

        Nein ich speichere in einer *.txt Datei woher meine Besucher kommen nur bei Firewalls usw. kann kein Referer ermittelt werden.

        Dann speichere doch einfach ein Leerfeld.

        Außerdem möchte ich auch Suchmaschinen nicht loggen da der Logfile nach der Fertigstellung des Scriptes auf meiner Webseite angezeigt werden soll.

        Da hast du dann aber reichlich Filterarbeit zu tun. Du weißt, dass es ungefähr dreihundert Millionen verschiedene User-Agents gibt? Und einige von denen sind ganz offiziell Suchmaschinen zugeordnet (d.h. der Suchmaschinenbetreiber gibt offiziell bekannt, welche User-Agents er benutzt), andere User-Agents schummeln, d.h. Suchmaschinen können sich auch als Internet Explorer tarnen. Es ist sogar möglich, dass Suchmaschinen sich mal zu erkennen geben, und mal getarnt kommen, um mögliche Suchmaschinenoptimierungen der Site zu erkennen - und möglicherweise zu betrafen.

        Mit anderen Worten: Du kannst die Seitenaufrufe protokollieren. Und den Referrer auch. Aber du kannst nicht sagen, was für einen Sinn der Seitenaufruf hatte, ob er automatisiert von einer Suchmaschine gezogen wurde oder von Menschen betrachtet.

        Zur Vielfalt der hier im Forum verwendeten User-Agents siehe auch http://webalizer.teamone.de/selfforum/agent_200212.htm.

        - Sven Rautenberg

        --
        Diese Signatur gilt nur am Freitag.
        1. Vielen Dank für die Antwort aber das einzige was ich möchte ist das nicht ermittelbare Referer nicht geloggt werden habe mal

          if ($from == '') {$from = 'No refer! ';}

          versucht und es klappt prima nur schreibt es nun bei jeden nicht ermittelbaren Referer "No refer!" in mein Loggfile.

          Was muss ich tun das garnichts ins loggfile geschrieben wird ?
          Auch keine leeren Zeilen oder so ?

          Desweiteren möchte ich auch lokale Adressen nicht Speichern da das Script Später zum Anzeigen meiner Referer auf meiner Webseite sein soll.

          1. Hi,

            wie schaut denn das ganze Script aus?

            Was muss ich tun das garnichts ins loggfile geschrieben wird ?
            Auch keine leeren Zeilen oder so ?

            Schreib einfach ein

            if ($HTTP_REFERER) {
            ..
            .. Dein Script
            ..
            }

            Desweiteren möchte ich auch lokale Adressen nicht Speichern da das Script Später zum Anzeigen meiner Referer auf meiner Webseite sein soll.

            Dann erweiter die obige Abfrage folgendermaßen:

            if ( $HTTP_REFERER && !stristr($HTTP_REFERER, "deineURL.de") ) {

            Ciao
            Chris

            1. Das ganze Script sieht so aus:

              <?php

              $name = 'daten.txt';   // file for datastoring
              $showdayvisits = 1;   // Show visits per day, 1 = yes, 0 = no

              if ( file_exists( $name) == FALSE)
              {

              $file = fopen($name, "w");
              if($file) {

              fputs($file, "");
              fputs($file, "\r\n");
              fputs($file, "\r\n");
                     fclose($file);
              }
              }

              $visitsaday = 1;
              $ipok = 1;
              $datum =date("d.m.Y");

              $file = fopen ($name, "r");
              while (!feof($file)) {
                  $buffer = fgets($file, 4096);
              {
              }

              }
              fclose ($file);

              $file = fopen($name, "r+");
              if ($showdayvisits == 1)
              rewind($file);
              fclose($file);

              if ($ipok == 1) {

              $from = $HTTP_REFERER;
              if ($from == '') {$from = 'no Referer';}
              if ($lange <91) {
              for ($i = 1; $i <= (90-$lange); $i++) {
                 $leer2= $leer2." ";
              }
              }

              $zeile= "$from";
              $file = fopen($name, "a");
              if($file) {
                     fputs($file, $zeile);
                     fputs($file,  "\r\n");
                     fclose($file);
              }
              }

              ?>

              Nur leider Funktioniert dein Vorschlag nicht denn dann bekomme ich eine Fehlermeldung

              1. Hallo, Daniela,

                "Polite people say HELO first" hätte es ein MTA genannt... ;)

                Das ganze Script sieht so aus:

                <?php

                $name = 'daten.txt';   // file for datastoring
                $showdayvisits = 1;   // Show visits per day, 1 = yes, 0 = no

                if (file_exists($name)==FALSE) {

                Die fopen()-Parameter 'w' und 'a' legen automatisch eine neue Datei an.

                $file = fopen($name, "w");

                Aha, öffne die Datei oder lege sie an und setze die Länge der Datei auf Null.

                if($file) {
                  fputs($file, "");

                Diese Zeile ist überflüssig.

                fputs($file, "\r\n");
                  fputs($file, "\r\n");

                Aha, schreibe zwei Zeilenumbrüche in die Datei.

                fclose($file);
                }
                }

                Was hat dieser Programmbereich überhaupt für einen Nutzen?

                $visitsaday = 1;
                $ipok = 1;
                $datum =date("d.m.Y");

                $file = fopen ($name, "r");

                Öffne die Datei zum Lesen.

                while (!feof($file)) {
                    $buffer = fgets($file, 4096);

                Lese nacheinander Zeilen aus der Datei, in $buffer dürfte also am Ende die letzte Zeile vorhanden sein.

                {

                Diese Klammer dürfte einen Syntaxfehler ausgeben.

                }

                }

                Diese Klammer ist auch zuviel.

                fclose ($file);

                Was sollte das Lesen aus der Datei? Die Variable $buffer wird im Programm nicht verwendet.

                $file = fopen($name, "r+");

                Öffne die Datei und setze den Zeiger auf den Dateianfang,

                if ($showdayvisits == 1)
                rewind($file);

                Setze den Zeiger erneut auf den Dateianfang. Was soll das?

                fclose($file);

                Aha, schließe die Datei, ohne irgendwelche Operationen vorgenommen zu haben. Wozu?

                if ($ipok == 1) {
                  $from = $HTTP_REFERER;

                Funktioniert nur bei register_globals=on, $_SERVER['HTTP_REFERER'] wäre passender.
                Im Übrigen könntest du auf isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']) prüfen.

                if ($from == '') {$from = 'no Referer';}
                  if ($lange <91) {

                $lange? Wo kommt diese Variable denn her? Was hat sie für einen Zweck?

                for ($i = 1; $i <= (90-$lange); $i++) {
                   $leer2= $leer2." ";
                  }

                Was soll das? Es werden Leerzeichen in der Variable $leer2 aneinandergereiht, die Variable $leer2 wird aber nicht weiter benutzt.
                Übrigens kann das auch $leer2.=" "; geschrieben werden.

                }

                $zeile= "$from";

                -> $zeile=$from;

                Diese Wertzuweisung ist unnötig, wieso verwendest du nicht $from?

                $file = fopen($name, "a");

                Aha, öffne die Datei zum Schreiben und setze den Zeiger auf das Dateiende.

                if($file) {
                  fputs($file, $zeile);
                  fputs($file,  "\r\n");
                  fclose($file);
                }

                Aha, endlich wird der Referer geloggt. fputs($file, $zeile."\r\n"); würde übrigens ausreichen

                }

                Bitte mache *logische* Einrückungen, sodass der Leser sofort sieht, welche Klammer welche Kontrollstruktur schließt.

                ?>

                Nur leider Funktioniert dein Vorschlag nicht denn dann bekomme ich eine Fehlermeldung

                Ach, und welche? Vielleicht denkst du erst einmal über das Programm nach, denn zu 80% ist es mehr oder weniger unverständlich und kommt mir deshalb völlig unsinnig vor, da ständig die Datei geöffnet und geschlossen wird aus mir unerfindlichen Gründen. Kann es sein, dass du nur einen Teil des Programmes und zusätzlich mehrere irrelevante Teile gepostet hast?

                Folgendes würde IIRC ausreichen:

                $name='daten.txt';
                if (isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER'] && !stristr($_SERVER['HTTP_REFERER'], "deineURL.de")) {
                 $file=@fopen($name, 'a');
                 if ($file) {
                  @fputs($file, $_SERVER['HTTP_REFERER']."\r\n");
                  @fclose($file);
                 }
                }

                Grüße,
                Mathias

                --
                Geschwisterzwist zwischen Slivovic schlürfenden, spitzen, twistenden und schwitzenden Zwitscherschwestern.
                Zwanzig Zwerge zeigen Handstand, zehn im Wandschrank, zehn am Sandstrand.
                Kalle Kahlekatzenglatzenkratzer kratzt kahle Katzenglatzen.
                Bietet Brunhilde berauschende Brüste, buhlt Bodo brünstig beim Balle.
                1. Hi Mathias,

                  Du machst es Daniela aber sehr einfach ;-)

                  if (isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER'] && !stristr($_SERVER['HTTP_REFERER'], "deineURL.de")) {

                  Da ist noch ein Tippfehler drinnen, also doch eine kleine Hürde für D. eingebaut. Eigentlich sollte das auch reichen:

                  if (!empty($_SERVER['HTTP_REFERER']) && !stristr($_SERVER['HTTP_REFERER'], "deineURL.de")) {

                  PHP Warnungen wegen nichtgesetzten Variablen können doch nur durch verschachtelten if-Anweisungen vermieden werden.

                  Ciao
                  Chris

                  1. Hallo, Chris,

                    if (isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER'] && !stristr($_SERVER['HTTP_REFERER'], "deineURL.de")) {

                    Da ist noch ein Tippfehler drinnen, also doch eine kleine Hürde für D. eingebaut.

                    Oh, ich sollte behaupten, ich hätte ihn absichtlich eingebaut. Natürlich fehlt eine schließende Klammer beim empty-Funktionsaufruf.

                    Eigentlich sollte das auch reichen:

                    if (!empty($_SERVER['HTTP_REFERER']) && !stristr($_SERVER['HTTP_REFERER'], "deineURL.de")) {

                    Stimm. Laut Dokumentation impliziert !empty() isset(), sodass !empty() ausreicht, darin habe ich mich wohl geirrt. Ich denke immer in Kategorien der Fehlerbehandlung, in welchen es zweifelsohne sinnvoll ist, zuerst zu überprüfen, ob der/die Parameter überhaupt übertragen wurde/n, bevor man den Inhalt prüft, um die Fälle unterschiedlich zu behandeln.

                    PHP Warnungen wegen nichtgesetzten Variablen können doch nur durch verschachtelten if-Anweisungen vermieden werden.

                    Was meinst du damit? Wieso verschachtelt, eine if-Anweisung reicht doch.

                    if ( [bedingung1] && [bedingung2] && [bedingung3] ) ...

                    Für den Fall, dass bedingung1 FALSCH ist, werden bedingung2 und bedingung3 nicht berechnet, insofern kommt es auf dasselbe heraus wie verschachtelte if-Anweisungen:

                    if ([bedingung1]) {
                     if ([bedingung2]) {
                      if ([bedingung3]) {
                       ...

                    Wenn bedingung1 überprüft, ob eine Variable gesetzt ist, können die Bedingungen 2 und 3 Ausdrücke enthalten, welche Warnungen auswerfen würden, wenn bedingung1 herausgenommen würde.

                    (Im Übrigen erinnere ich mich nicht, wann ich das letzte Mal auf Warnungen gestoßen bin, das heißt ich weiß nicht, wann sie genau auftreten...)

                    Grüße,
                    Mathias

                    --
                    Mein Leben, ein Leben ist es kaum, / Ich gehe dahin als wie im Traum.
                    Wie Schatten huschen die Mensch hin, / Ein Schatten dazwischen ich selber bin.
                    Und im Herzen tiefe Müdigkeit - / Alles sagt mir: Es ist Zeit ...
                    (Theodor Fontane, Mein Leben)
                    1. Hallo molily,

                      (Im Übrigen erinnere ich mich nicht, wann ich das letzte Mal
                      auf Warnungen gestoßen bin, das heißt ich weiß nicht, wann
                      sie genau auftreten...)

                      ini_set('display_errors', '1');
                      error_reporting(E_ALL);

                      Dann kannst du dich sicher vor lauter Warnungen nicht mehr
                      retten ;)

                      Gruesse,
                       CK

                      1. Hallo molily,

                        und dann siehst du den kleinen aber manchmal sehr entscheidenden Unterschied zwischen:

                        <?php
                        ini_set('display_errors', '1');
                        error_reporting(E_ALL);

                        if ( !empty($variable) && $variable != "irgendwas" )
                          echo $variable;
                        ?>

                        und

                        <?php
                        ini_set('display_errors', '1');
                        error_reporting(E_ALL);

                        if ( !empty($variable) )
                          if ( $variable != "irgendwas" )
                            echo $variable;
                        ?>

                        Ciao
                        Chris

                        1. Hallo Chris,

                          ini_set('display_errors', '1');
                          error_reporting(E_ALL);

                          if ( !empty($variable) && $variable != "irgendwas" )
                            echo $variable;
                          ?>

                          und

                          <?php
                          ini_set('display_errors', '1');
                          error_reporting(E_ALL);

                          if ( !empty($variable) )
                            if ( $variable != "irgendwas" )
                              echo $variable;
                          ?>

                          Da ist kein Unterschied. Das zweite, durch AND verknuepfte
                          Argument *darf* erst dannn ausgewertet werden, wenn das
                          erste Argument true ergab. Das PHP da eine Warning ausgibt,
                          hat nichts mit den Tatsachen zu tun.

                          Gruesse,
                           CK

        2. Hallo, Sven,

          Du weißt, dass es ungefähr dreihundert Millionen verschiedene User-Agents gibt?

          *fg* Diese »Hausnummer«, die nicht bewiesen und auch nicht widerlegt werden kann, erinnert mich an http://www.s.netic.de/abel/javascript-verteilung.shtml...

          Recht hast du natürlich, aber die Zahl ist doch mehr oder weniger beliebig, ob es nun »nur« Tausend oder dreihundert Millionen verschiedene sind, ist für das Argument nicht bedeutend. ;)

          Eine ähnliche im Grunde informationslose Aussage wäre: »Wusstest du, dass es dreihundert Milliarden Sterne in dieser Galaxie gibt?« - »Och! Sooo viele, sag bloß. Nee, wusste ich nicht.«.

          SCNR.

          Grüße,
          Mathias

          --
          Geschwisterzwist zwischen Slivovic schlürfenden, spitzen, twistenden und schwitzenden Zwitscherschwestern.
          Zwanzig Zwerge zeigen Handstand, zehn im Wandschrank, zehn am Sandstrand.
          Kalle Kahlekatzenglatzenkratzer kratzt kahle Katzenglatzen.
          Bietet Brunhilde berauschende Brüste, buhlt Bodo brünstig beim Balle.