Dino Müller: Redirect auf HTML-Seite

Hallo,

ich habe folgendes Problem:
Um Fehlermeldungen á la "Error 404 - File not found" abzufangen, kann ich bei
meinem Provider die Standardfehlermeldungen durch entsprechende CGI-Dateien
(error404.cgi usw.) ersetzen, die dann den entsprechenden HTML-Code generieren.

Nur habe ich noch nicht viel mit CGI/PERL gemacht, und möchte deshalb normale
HTML-Dateien benutzen und nur einen Redirect auf die entsprechenden Dateien
setzen.

Also:
Was muß ich in Perl schreiben um z.B. einen Redirect auf
www.domain.com/error/error404.html
zu setzen ?

MfG
  Dino.

  1. Hi,

    ich habe folgendes Problem:
    Um Fehlermeldungen á la "Error 404 - File not found" abzufangen, kann ich bei
    meinem Provider die Standardfehlermeldungen durch entsprechende CGI-Dateien
    (error404.cgi usw.) ersetzen, die dann den entsprechenden HTML-Code generieren.

    Nur habe ich noch nicht viel mit CGI/PERL gemacht, und möchte deshalb normale
    HTML-Dateien benutzen und nur einen Redirect auf die entsprechenden Dateien
    setzen.

    Also:
    Was muß ich in Perl schreiben um z.B. einen Redirect auf
    www.domain.com/error/error404.html
    zu setzen ?

    normalerweise geht das mit der Datei .htaccess, die Du in Deinem WWW-Rootverzeichnis unterbringst. Dort muß nur folgende Zeile stehen:

    ErrorDocument 404 http://www.domain.com/error/error404.html

    Wenn es wirklich mit einem CGI-Script gemacht werden soll, tut es folgendes:

    #!/usr/bin/perl
    print "Location: http://www.domain.com/error/error404.html\n\n";

    Die erste Zeile lautet vielleicht anders, frag dazu Deinen Provider ("Pfad zum Perl-Interpreter").

    Cheatah

    1. Danke, ich habs jetzt per .htaccess gemacht Und zwar so:

      ErrorDocument 401 http://www.domain.com/error401.html
      ErrorDocument 404 http://www.domain.com/error404.html

      Nur ein Problem habe ich:
      Kann es sein das die .htaccess Datei nur für das Verzeichnis gilt, wo sie drinsteht?
      Ich habe nämlich noch ein passwortgeschütztes Verzeichnis (auch per .htaccess),
      und wenn ich da ein falsches Passwort eingebe, müßte ja eigentlich die error401.html
      kommen, oder? Stattdessen kommt die 401-Datei vom Provider, nicht aber meine eigene.

      Kann es sein, das die .htaccess Datei im geschützten Verzeichnis Vorrang vor der anderen
      hat und diese außer Kraft setzt ? Muß ich die 'ErrorDocument' Parameter auch in diese
      Datei schreiben?

      MfG
        Dino

      1. Hi,

        Danke, ich habs jetzt per .htaccess gemacht Und zwar so:

        ErrorDocument 401 http://www.domain.com/error401.html
        ErrorDocument 404 http://www.domain.com/error404.html

        jepp :-)

        Nur ein Problem habe ich:
        Kann es sein das die .htaccess Datei nur für das Verzeichnis gilt, wo sie drinsteht?
        Ich habe nämlich noch ein passwortgeschütztes Verzeichnis (auch per .htaccess),
        und wenn ich da ein falsches Passwort eingebe, müßte ja eigentlich die error401.html
        kommen, oder? Stattdessen kommt die 401-Datei vom Provider, nicht aber meine eigene.

        Ich weiß nicht, vielleicht wird "Unauthorized" auf höherer Ebene erkannt, bevor die /www-root/.htaccess geladen wird. Bei mir funktioniert das jedenfalls mit einer einzigen .htaccess; allerdings habe ich auch nur 403 (ungetestet), 404 und 501 abgefangen.

        Kann es sein, das die .htaccess Datei im geschützten Verzeichnis Vorrang vor der anderen
        hat und diese außer Kraft setzt ? Muß ich die 'ErrorDocument' Parameter auch in diese
        Datei schreiben?

        Keine Ahnung, probier's aus. Wie sehr die Hierarchie geregelt ist findest Du evtl. bei http://www.apache.org, also ob ein fehlendes ErrorDocument einem Override entspricht. Soweit ich weiß wird in der Verzeichnishierarchie zumindest solange zurückgegangen, bis eine .htaccess gefunden wird; ob danach weitergesucht wird weiß ich nicht.

        Cheatah

        1. Ich frag einfach mal bei meinem Provider, wieso das nicht geht.

          Nebenbei hab ich das nochmal per cgi Probiert.
          Wenn ich normalen HTML-Code als Ausgabe habe, funktionert das auch
          (der Browser zeigt des entsprechenden Code an)
          Nur funktioniert der redirect nicht. Netscape sagt immer, das Dokument
          enthält keine Daten.

          Mit IE hab ichs noch nicht ausprobiert, hab aber gehört, das es damit keine
          Probleme gibt.

          Ist das n Bug in Netscape ?

          cu,
            Dino.

          1. Hi,

            Ich frag einfach mal bei meinem Provider, wieso das nicht geht.

            gute Idee.

            Nebenbei hab ich das nochmal per cgi Probiert.
            Wenn ich normalen HTML-Code als Ausgabe habe, funktionert das auch
            (der Browser zeigt des entsprechenden Code an)
            Nur funktioniert der redirect nicht. Netscape sagt immer, das Dokument
            enthält keine Daten.

            Mit IE hab ichs noch nicht ausprobiert, hab aber gehört, das es damit keine
            Probleme gibt.

            Ist das n Bug in Netscape ?

            Bestimmt nicht. Wenn "Document contains no data" angezeigt wird, dann stimmt das auch. Vermutlich hast Du einen falschen Header angegeben. Richtig wäre:

            print "Location: http://domain.de/pfad/zur/datei.html\n\n";

            Cheatah

            1. Bestimmt nicht. Wenn "Document contains no data" angezeigt wird, dann stimmt das auch. Vermutlich hast Du einen falschen Header angegeben. Richtig wäre:

              print "Location: http://domain.de/pfad/zur/datei.html\n\n";

              Ich habs ausprobiert, funktioniert aber immer noch nicht.
              Weder beim IE noch bei Netscape.

              Meine error401.cgi sieht jetzt so aus:

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

              #!/usr/bin/perl
              print "Location: http://domain.de/pfad/zur/datei.html\n\n";

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

              Aber wie gesagt, es funktioniert nicht.

              MfG,
                Dino.

              1. Hi,

                Bestimmt nicht. Wenn "Document contains no data" angezeigt wird, dann stimmt das auch. Vermutlich hast Du einen falschen Header angegeben. Richtig wäre:

                print "Location: http://domain.de/pfad/zur/datei.html\n\n";

                Ich habs ausprobiert, funktioniert aber immer noch nicht.
                Weder beim IE noch bei Netscape.

                Meine error401.cgi sieht jetzt so aus:


                #!/usr/bin/perl
                print "Location: http://domain.de/pfad/zur/datei.html\n\n";

                ich hoffe doch sehr, Du hast "domain.de/pfad/zur/datei.html" an Deine Bedürfnisse angepaßt, oder? ;-)

                Wie ist denn der Aufruf der error401.cgi, sprich: Was hast Du wo wie eingestellt?

                Im Zweifelsfall laß es aber mal von Deinem Provider überprüfen, der sollte seine Konfigurationen kennen...

                Cheatah

                1. ich hoffe doch sehr, Du hast "domain.de/pfad/zur/datei.html" an Deine Bedürfnisse angepaßt, oder? ;-)

                  kein Kommentar ;)

                  Wie ist denn der Aufruf der error401.cgi, sprich: Was hast Du wo wie eingestellt?

                  Wenn ein Fehler auftritt, wird automatisch ein entsprechendes CGI-Script aufgerufen
                  (errorXXX.cgi), sofern das vorhanden ist. Wenn keins da ist, kommt ne Standard-Fehlermeldung
                  vom Provider. Ich selber kann an dem Aufruf nichts ändern.

                  Dino.

                  1. Hi,

                    Wie ist denn der Aufruf der error401.cgi, sprich: Was hast Du wo wie eingestellt?

                    Wenn ein Fehler auftritt, wird automatisch ein entsprechendes CGI-Script aufgerufen
                    (errorXXX.cgi), sofern das vorhanden ist. Wenn keins da ist, kommt ne Standard-Fehlermeldung
                    vom Provider. Ich selber kann an dem Aufruf nichts ändern.

                    eigenwillig.

                    Tja, dann hat der Provider seinen Server auf ganz bestimmte Art konfiguriert, über die ich hier nur spekulieren kann. Frag am besten dort noch mal nach, schildere das Script und die Fehler in allen Details - er wird Dir am ehesten helfen können.

                    Cheatah

      2. Nur ein Problem habe ich:
        Kann es sein das die .htaccess Datei nur für das Verzeichnis gilt, wo sie drinsteht?

        Nein, es gilt für dieses und alle darunter liegenden Verzeichnisse. Wenn Du also server.de/privat so schützt, gilt der Inhalt dieser .htaccess-Datei auch für server.de/privat/nocheineebene/ und so weiter.

        Zumindest ist das bei Apache so...

        Siehe auch http://www.apache.de/docs/misc/perf-tuning.html im Abschnitt "AllowOverride". Hier wird der Mechanismus im Zusammenhang mit der Geschwindigkeits-Optimierung von Apache erläutert. Apache muss nämlich bei jedem Zugriff auf eine Seite zunächst nach .htaccess in allen betroffenen Verzeichnissen suchen.

        Ich zitiere:

        -- Snip --

        AllowOverride

        Wherever in your URL-space you allow overrides (typically .htaccess files) Apache will attempt to open .htaccess for each filename component. For example,

        DocumentRoot /www/htdocs
             <Directory />
                 AllowOverride all
             </Directory>

        and a request is made for the URI /index.html. Then Apache will attempt to open /.htaccess, /www/.htaccess, and /www/htdocs/.htaccess. The
        solutions are similar to the previous case of Options FollowSymLinks. For highest performance use AllowOverride None everywhere in your filesystem.

  2. Was muß ich in Perl schreiben um z.B. einen Redirect auf
    www.domain.com/error/error404.html
    zu setzen ?

    Zwei Möglichkeiten.

    #!/usr/bin/perl

    Umleitung

    $url = "http://www.domain.com/error/error404.html";

    print <<UMLEITUNG
    Location: $url
    Content-type: text/html

    Hier sind Sie falsch.<p>
    Versuchen Sie es doch mal <a href="$url">hier</a>.<p>
    UMLEITUNG

    Ende

    Oder die zweite Möglichkeit:

    #!/usr/bin/perl

    Ausgabe der Datei

    print "Content-type: text/html\n\n;

    open(DATEI, "/hier/der/pfad/zur/datei/error404.html");
    while (<DATEI>) {
    print $_;
    }
    close(DATEI);

    Ende

    Die 2. Möglichkeit ist zu bevorzugen, weil dann der Browser nicht umgeleitet wird. Die fehlerhafte URL bleibt also im Adress-Feld stehen und kann korrigiert werden.

  3. Hallo,

    ich habe folgendes Problem:
    Um Fehlermeldungen á la "Error 404 - File not found" abzufangen, kann ich bei
    meinem Provider die Standardfehlermeldungen durch entsprechende CGI-Dateien
    (error404.cgi usw.) ersetzen, die dann den entsprechenden HTML-Code generieren.

    Hi...
    ich hab leider von CGI auch keine Ahnung.. aber mal als
    kleiner Gedankenanstoss (für später wenn du mal der
    grosse CGI-Master bist :)) :
    Ich hab inzwischen für die 404 Errors nen Seite gemacht
    die mir direkt ne Mail schickt mit der angeforderten
    Addresse und mit der Browser Version des Besuchers..
    so kann ich dann zumindestens versuchen den Fehler zu
    finden und auzumerzen.. allerdings alles in ASP :)
    Gerade wenn man noch ne version der Seite für ältere
    Browser hat ist das doch teilweise erschreckend was
    da so zutage kommt..

    gruss
    Jens