Björn Poller: F: Über $HOST verschiedene Seiten anzeigen?

Hi Leute,

ich befasse mich erst seit kurzem mit CGI/Perl und habe bis jetzt nur vorhandene Skripte verändert/aktualisiert.

Ich würde jetzt gerne folgendes unter Perl realisieren:
In meinen LogFiles steht vorne die Rechner-Adresse (IP o. URL) des Benutzers, der auf meine Seiten zugreift. Ich möchte nun ein Skript schreiben, mit dem ich je nach Benutzer eine individuelle HTML Seite generieren kann. Im aktuell Fall handelt es sich um "proxy.[name].de". Über eine IF-Schleife würde ich dann entweder eine Weiterleitungsseite oder aber eine STOP-Seite generiern.

Leider weiß ich aber noch nicht wie die Umgebungsvariable lautet (Stimmt $HOST ?) und wie ich die Variable abfrage.

Könnte mir einer von euch einen Tip(p) geben ?

Danke,
Björn

  1. Hallo,

    ich bin schon weiter gekommen, leider werde ich aber bei folgendem Skript immer auf www.linux.de weitergeleitet, anstatt auf www.heise.de. Hat jemand ne Ahnung, wo der Fehler ist ?

    Danke.

    #!/usr/bin/perl

    require "cgi-lib.pl";

    $Server = $ENV{REMOTE_HOST};
    $BadServer = "proxy.zdf.de";

    if ($Server != $BadServer) {
      $url = "http://www.heise.de";
    }
    else {
      $url = "http://www.linux.de";
    }

    use CGI qw|:standard|;
    print redirect $url;

    1. Seawas,

      ich bin schon weiter gekommen, leider werde ich aber bei folgendem Skript immer auf www.linux.de weitergeleitet, anstatt auf www.heise.de. Hat jemand ne Ahnung, wo der Fehler ist ?

      require "cgi-lib.pl";

      Wozu brauchst du das ?

      if ($Server != $BadServer) {

      probiers mal mit "ne" statt "!="

      lg bernhard

      http://www.teamone.de/selfhtml/tgbd.htm
      http://www.teamone.de/selfhtml/tgc.htm

      PS: If-Blöcke sind keine Schleifen sondern Statements (dt.:Anweisungen) - zwei grundverschiedene Dinge!

    2. Hallo,

      require "cgi-lib.pl";

      wie Bernhard schon sagte, ist das eigentlich unnötig, da Du ja auch

      use CGI qw|:standard|;

      verwendest. Der Ordnung halber schreibe ich sowas auch gleich am Anfang des Scripts hin.

      $Server = $ENV{REMOTE_HOST};

      Gut in der Idee, aber... $ENV{REMOTE_HOST} ist nicht zwangsläufig vorhanden.
      $ENV{REMOTE_ADDR} ist da sicherlich die bessere Wahl.

      $BadServer = "proxy.zdf.de";
      if ($Server != $BadServer) {

      Wie Bernhard ebenfalls schon bemerkte, 'ne' statt '!=', da Du ja keinen Vergleich von Zahlen machen willst.

      if ($Server != $BadServer) {
        $url = "http://www.heise.de";
      }
      else {
        $url = "http://www.linux.de";
      }

      Ich bevorzuge in solchen Fällen, eine eher restriktive Prüfung.
      Zumindest solltest Du die Existenz von $Server abfragen. Wenn immer der 'else'-Zweig einer Abfrage ausgeführt wird, hat das meist den Grund, daß die Bedingung nicht sauber ist.
      Also beispielsweise:
      if (($Server) and $Server ne $BadServer)
         {
         $url = "http://www.heise.de";
         }
      else
         {
         $url = "http://www.linux.de";
         }

      Abgesehen davon, ist die Auswertung von IP-Adressen des Clients sicherlicht nicht ein gutes Mittel eines BEnutzers, da sich die IP-Adresse im Laufe eines Besuchs Deiner Seiten auch ändern kann. Denke nur an Einwahlverbindungen des Clients.

      Grüße
        Klaus

      1. if (($Server) [...]
        Zumindest solltest Du die Existenz von $Server abfragen. Wenn immer der 'else'-Zweig einer Abfrage ausgeführt wird, hat das meist den Grund, daß die Bedingung nicht sauber ist.

        Was verstehst Du denn unter 'Existenz'? Du testest, ob der Wert der Variable *wahr* ist - nichts anderes! Den Sinn sehe ich hier ehrlich gesagt nicht.

        Peter

        1. if (($Server) [...]
          Den Sinn sehe ich hier ehrlich gesagt nicht.

          musst du auch nicht.

          1. Hallo,

            if (($Server) [...]
            Den Sinn sehe ich hier ehrlich gesagt nicht.

            musst du auch nicht.

            Das verstehe ich jetzt nicht

            Klaus

        2. Hallo,

          Zumindest solltest Du die Existenz von $Server abfragen. Wenn immer der 'else'-Zweig einer Abfrage ausgeführt wird, hat das meist den Grund, daß die Bedingung nicht sauber ist.

          Was verstehst Du denn unter 'Existenz'? Du testest, ob der Wert der Variable *wahr* ist - nichts anderes! Den Sinn sehe ich hier ehrlich gesagt nicht.

          erster Ansatz:

          if ($Server ne $BadServer)
             {
             $url = "http://www.du-darfst.de";
             }
          else
             {
             $url = "http://www.du-nicht.de";
             }

          Hier wird der erste if-Zweig auch ausgeführt, wenn $Server gar keinen brauchbaren Wert besitzt.

          mein Ansatz:

          if (($Server) and $Server ne $BadServer)
             {
             $url = "http://www.du-darfst.de";
             }
          else
             {
             $url = "http://www.du-nicht.de";
             }

          Hier wird zuerst geprüft, ob $Server *wahr* ist, also irgendwas drinsteht, das nicht undef, "" oder 0 ist. Das meinet ich mit Existenzprüfung.
          Erst wenn dies ok ist, wird noch geprüft, of $Server nicht etwa $BadServer ist.
          Zugegeben, eine noch immer zu ungenaue Prüfung, aber es diente ja nur der Veranschaulichung, daß man nicht immer davon ausgehen kann, daß in Variablen auch was prüfbares drinsteht.
          Aber das scheint ja voll in die Hose gegangen zu sein, das mit dem veranschaulichmachen :-(

          Grüße
            Klaus

    3. Ein großes Danke an Klaus und Bernhard. Es funktioniert jetzt !

      Hier noch einge Antworten zu den Anmerkungen:

      require "cgi-lib.pl";

      -> War noch aus der Fehlersuche, war über den Gebrauch nicht ganz sicher.

      $Server = $ENV{REMOTE_HOST};

      -> In meinem Fall ist diese Variable bei dem bestimmten Besucher immer gesetzt, ansonsten hat Klaus natürlich recht, dass man prinzipiell mit der IP ($REMOTE_ADDR) besser fährt.

      if ($Server != $BadServer) [richtig: ne]

      &

      PS: If-Blöcke sind keine Schleifen sondern Statements

      -> Ich hoff, dass mein Professor diese Gruppe nicht liest, ist natürlich als angehender Informatiker ein "peinlicher" Flüchtigkeitsfehler :-) gewesen.

      #!/usr/bin/perl

      ##############################################

      Dieses Script soll den Zugriff eines

      bestimmten Besuchers mit einer eigenen

      Standleitung und permanter URL

      (z.B. eigener Proxy) anders behandeln,

      als den Zugriff der anderen Besucher.

      #                                            #

      Anmerkung: Die Umgebungsvariable

      $REMOTE_HOST muß nicht immer gesetzt sein.

      Für eine allgemeingültige Lösung wäre die

      Abfrage von $REMOTE_ADDR (->IP) zu nehmen.

      ##############################################

      use CGI qw|:standard|;

      $Server = $ENV{REMOTE_HOST};
      $BadServer = "proxy.zdf.de";

      if ( $Server ne $BadServer ) {
        $url = "http://www.heise.de";
      }
      else {
        $url = "http://www.linux.de";
      }

      print redirect $url;