Hans Thomas Vogler: 404 - Fehler abfangen

Gott zum Gruße,

kennt hier jemand einen Möglichkeit, den Fehler "404" (Datei nicht vorhanden) mit Hilfe von Javascript *brauserübergreifend* festzustellen und abzufangen?

Wäre schön.

Servus,
T.

  1. Gott zum Gruße,

    kennt hier jemand einen Möglichkeit, den Fehler "404" (Datei nicht vorhanden) mit Hilfe von Javascript *brauserübergreifend* festzustellen und abzufangen?

    hmmmmmmmm.. wo willste denn das JavaScript reinschreiben? In die Datei, die nicht gefunden werden konnten?? :-)

    1. Hallo Olaf, du künftiger Nobelpreisträger,

      hmmmmmmmm.. wo willste denn das JavaScript reinschreiben? In die Datei, die nicht gefunden werden konnten?? :-)

      Ich könnte ja eine nachgeordnete Brauserinstanz abfragen wollen, oder den "opener" oder einen frame.

      Aber das sagt Dir alles bestimmt nichts, nich wahr?

      servus,
      T.

      1. Einen friedvollen guten Morgen,

        [...]

        Eine der grundlegenden Eigenschaften von JavaScript ist, dass es clientseitig, also im Browser des Besuchers, ausgeführt wird. Ob das nun gut oder schlecht oder gar böse ist, kann ich nicht entscheiden. Fest steht jedoch, dass dem Browser erst einmal JS-Code vom Server gesendet werden muss, damit er (der Browser) ihn ausführen kann. Und genau da liegt das Problem. Du willst via JS einen Server-Fehler (in deinem Beispiel 404) "abfangen". Dazu muss aber erst mal der Browser eine Anfrage an den Server senden, z.B. fordert er die Seite blablubb.html an. Bildlich gesprochen schaut der Server nach, ob es diese Seite gibt und schickt sie an den Browser. Stellt der Server jedoch fest, dass es diese Seite gar nicht gibt, sendet er eine Fehlerseite (z.B. http://selfhtml.teamone.de/blablubb.html). Das heißt aber, dass in diesem Fall auch "nur" eine HTML-Seite bei dir ankommt, die z.B. auch so aussehen kann http://www.rt211.de/blablubb.html. Was er _nicht_ sendet, ist irgendeine Information (Statuscode o.ä.), aus dem du ableiten kannst, dass eine aufgerufene Seite nicht vorhanden ist. Was beim Browser ankommt, entscheidet der Server, wenn JS überhaupt erst die Chance hat, zu reagieren, ist der sprichwörtliche Keks bereits gegessen.

        Lange Vorrede, kurzer Sinn: was du vorhast ist mit JavaScript nicht möglich.

        Viele Grüße
        Torsten

        --
        Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
        1. Hi,

          Stellt der Server jedoch fest, dass es diese Seite gar nicht gibt, sendet er eine Fehlerseite

          man koennte die Fehlerseite mit einem JavaScript-Code versehen, der besipielsweise eine Fehlermeldung alerted und dann ein "History-1" ausloest. - Aber einen Schoenheitspreis gibt es fuer diese Loesung sicherlich nicht.

          Verweise auf nicht vorhandene Seiten sind vergleichbar mit Programmfehlern in "Standardapplikationen". Bei diesen sollte allerdings idealerweise eine globale Fehlerbehandlungsroutine greifen. - Also ist o.g. "Loesung" vielleicht gar nicht mal so dull.

          Gruss,
          Lude

          1. Hi,

            Hallöchen,

            Stellt der Server jedoch fest, dass es diese Seite gar nicht gibt, sendet er eine Fehlerseite

            Eben. Was mich interessiert ist, ob es da irgendwelche eindeutigen Identifikationsmerkmale gibt, die ich abfragen kann.

            man koennte die Fehlerseite mit einem JavaScript-Code versehen,

            Die "Fehlerseite"? Was verstehst unter der "Fehlerseite"?

            der besipielsweise eine Fehlermeldung alerted und dann ein "History-1" ausloest. - Aber einen Schoenheitspreis gibt es fuer diese Loesung sicherlich nicht.

            Ich arbeite mit "blinden" Frames deren Inhalt erst angezeigt wird, wenn der - in JS programmierte - Client-Manager sie ausgewertet hat.

            Gruss,
            Lude

            1. Hi,

              Ich arbeite mit "blinden" Frames deren Inhalt erst angezeigt wird, wenn der - in JS programmierte - Client-Manager sie ausgewertet hat.

              es gibt grundsaetzlich zwei "Fehlerklassen". Die erste wird serverseitig generiert, also wenn sich der Browserclient an einen Webserver wendet und der eine "Seite" nicht liefern kann. Die zweite ist gegeben, wenn der Browserclient den Server nicht findet.

              Ich hatte Dich urspruenglich falsch verstanden; was Du vorhast ist ein JavaScript-"Loader", der auf nicht geladene Seiten reagiert. Fuer nicht gefundene Bildressourcen (img) gibt es so ein JS-Event. Fuer nicht gefundene "Seiten" weiss ich nicht. Das muesste man dann eventuell auf "HTTP-Ebene" regeln (s.o.)

              Ws hast Du denn genau vor? - Willst Du eigene oder auch fremde "Seiten" verwalt-loaden?

              Gruss,
              Lude

              1. Hi,

                Hi auch,

                es gibt grundsaetzlich zwei "Fehlerklassen". Die erste wird serverseitig generiert, also wenn sich der Browserclient an einen Webserver wendet und der eine "Seite" nicht liefern kann. Die zweite ist gegeben, wenn der Browserclient den Server nicht findet.

                Und wie kann ich diese "Klassen" und ihre Rückmeldung eindeutig identifizieren?

                Ich hatte Dich urspruenglich falsch verstanden; was Du vorhast ist ein JavaScript-"Loader", der auf nicht geladene Seiten reagiert. Fuer nicht gefundene Bildressourcen (img) gibt es so ein JS-Event. Fuer

                Das ist mir bekannt.

                Ws hast Du denn genau vor? - Willst Du eigene oder auch fremde "Seiten" verwalt-loaden?

                In erster Linie eigene, und d.h. es muß auch im lokalen offline-Betrieb funktionieren. Für Fremdseiten wäre es praktisch, um ggf. kaputte Links entsprechend abzufangen und eine entsprechende Rückmeldung an Webmaster in die Wege zu leiten.

                Gruss,
                Lude

                Gruss auch, und schönes Wochenende

                servus,
                T.

        2. Hi,

          Was er _nicht_ sendet, ist irgendeine Information (Statuscode o.ä.), aus dem du ableiten kannst, dass eine aufgerufene Seite nicht vorhanden ist.

          Du solltest Dich nochmal etwas mit http (http://www.ietf.org/rfc/rfc2616.txt) beschäftigen.
          Selbstverständlich wird vom Server ein Statuscode gesendet.
          Siehe Anfang von Abschnitt 6:

          6 Response  
            
             After receiving and interpreting a request message, a server responds  
             with an HTTP response message.  
            
                 Response      = Status-Line               ; Section 6.1  
                                 \*(( general-header        ; Section 4.5  
                                  | response-header        ; Section 6.2  
                                  | entity-header ) CRLF)  ; Section 7.1  
                                 CRLF  
                                 [ message-body ]          ; Section 7.2  
            
          6\.1 Status-Line  
            
             The first line of a Response message is the Status-Line, consisting  
             of the protocol version followed by a numeric status code and its  
             associated textual phrase, with each element separated by SP  
             characters. No CR or LF is allowed except in the final CRLF sequence.  
            
                 Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF  
          

          Daß dieser Status-Code (meines Wissens) nicht mit Javascript abfragbar ist, ist eine andere Sache...

          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.
          http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
          1. Mahlzeit,

            Du solltest Dich nochmal etwas mit http (http://www.ietf.org/rfc/rfc2616.txt) beschäftigen.

            Jaja, zu welchen Theorien man sich so des Nachts hinreißen lässt ...

            Viele Grüße
            Torsten

            --
            Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
        3. Guten Morgen Torsten

          Das heißt aber, dass in diesem Fall auch "nur" eine HTML-Seite bei dir ankommt, die z.B. auch so aussehen kann http://www.rt211.de/blablubb.html. Was er _nicht_ sendet, ist irgendeine Information (Statuscode o.ä.), aus dem du ableiten kannst, dass eine aufgerufene Seite nicht vorhanden ist.

          Er sendet keinen Statuscode? Ich dachte HTTP/0.9 hätten wir hinter uns gelassen. ;-)
          Er sendet einen Statuscode und theorethisch könnte man doch einen Browser programmieren, der Zugriff per JavaScipt auf diesen bietet, z.B. über document.statusCode, oder?

          Was beim Browser ankommt, entscheidet der Server, wenn JS überhaupt erst die Chance hat, zu reagieren, ist der sprichwörtliche Keks bereits gegessen.

          Lange Vorrede, kurzer Sinn: was du vorhast ist mit JavaScript nicht möglich.

          Das stimmt natürlich immer noch.

          Schöne Grüße

          Johannes

          --
          ss:| zu:) ls:[ fo:) de:] va:) ch:? sh:( n4:& rl:( br:< js:| ie:{ fl:( mo:}
          1. Mahlzeit,

            Er sendet keinen Statuscode? Ich dachte HTTP/0.9 hätten wir hinter uns gelassen. ;-)
            [...]

            Ja, du hast recht, Asche auf mein Haupt.

            Allerdings denke ich, dass mein Posting ansonsten durchaus zutreffend ist. Soweit ich weiß, besteht die via HTTP übermittelte Nachricht aus einem Header und den Daten, wobei das HTML-Dokument im Datenabschnitt enthalten ist, der Servercode steht im Header. Nun ist es afaik eben so, dass man mit JS nicht auf den Header sondern nur auf die gesendeten Daten - sprich die HTML-Datei - zugreifen kann. Deshalb ist imho das Abfragen des Servercodes mit Hilfe von JS nicht möglich. Sollte es doch gehen, habe ich mich eben geirrt :(

            Viele Grüße
            Torsten

            --
            Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
            1. Hallo Siechfred

              Er sendet keinen Statuscode? Ich dachte HTTP/0.9 hätten wir hinter uns gelassen. ;-)
              [...]

              Ja, du hast recht, Asche auf mein Haupt.

              War ja auch schon etwas früh am Morgen. ;-)

              Nun ist es afaik eben so, dass man mit JS nicht auf den Header sondern nur auf die gesendeten Daten - sprich die HTML-Datei - zugreifen kann. Deshalb ist imho das Abfragen des Servercodes mit Hilfe von JS nicht möglich. Sollte es doch gehen, habe ich mich eben geirrt :(

              Der Zugriff auf HTTP-Header ist mit JavaScript AFAIK nicht möglich, aber es gibt Ausnahmen: document.lastModified und document.Referrer machen es möglich die Werte des Last-Modified und des Referer Headers auszuwerten. Für einen Browser-Programmierer dürfte es deshalb wohl nicht das Problem sein, das Auslesen anderer Header mit javaScript zu ermöglichen.

              Schöne Grüße

              Johannes

              --
              ss:| zu:) ls:[ fo:) de:] va:) ch:? sh:( n4:& rl:( br:< js:| ie:{ fl:( mo:}
      2. »» Ich könnte ja eine nachgeordnete Brauserinstanz abfragen wollen, oder den "opener" oder einen frame.

        Aber das sagt Dir alles bestimmt nichts, nich wahr?

        mit JS machste das.... bestimmt nicht lalala.. :-)

        1. mit JS machste das.... bestimmt nicht lalala.. :-)

          Du vielleicht nicht - ich schon :-)

          servus,
          T.

          1. Hi Han Thomas,

            Du vielleicht nicht - ich schon :-)

            Das will ich sehen - es ist nämlich schlichtweg unmöglich.

            Gruss,
              Carsten

            1. Du vielleicht nicht - ich schon :-)

              Das will ich sehen - es ist nämlich schlichtweg unmöglich.

              ...unmöglich ist ein häßliches Wort. Ich mache seit fast einem Jahr kaum etwas anderes :-)

              "Geht nicht" gibt´s nicht!

              servus,
              T.

  2. Hi Hans Thomas,

    kennt hier jemand einen Möglichkeit, den Fehler "404" (Datei nicht vorhanden) mit Hilfe von Javascript *brauserübergreifend* festzustellen und abzufangen?

    Eine solche Möglichkeit gibt es nicht.

    Gruss,
      Carsten

  3. kennt hier jemand einen Möglichkeit, den Fehler "404" (Datei nicht vorhanden) mit Hilfe von Javascript *brauserübergreifend* festzustellen und abzufangen?

    Hallo zusammen,

    ich glaube das könnte doch mit Javascript klappen. Es müssten allerdings folgende Vorraussetzungen gegeben sein: Die Basisseite ist ein Frameset (Menue und Main),
    Die Links sollten via Script in Main geladen werden, anschließen muss getestet
    werden ob der Titel der zu Ladenden Datei "404" enthält, da meines wissens jeder
    Browser automatisch diese Ziffer im Titel generiert. (dies eventuell alle 2-3 Sek. testen lassen.)
    Wenn dies der Fall ist, kann ein Ausweichlink auf eine Benutzerdefinierte
    Fehleseite aufgeufen werden.
    Gar nicht so schlecht die Idee eine Fehlerseite abzufangen, gerade bei externen
    Links. Ich werde mich mal ransetzten und etwas schreiben, wenn ich erfolgreich bin
    gibts bald ein wenig Code an die Hand.

    Tschö
    euer RatzeP

    1. Hallo RatzeP

      da meines wissens jeder
      Browser automatisch diese Ziffer im Titel generiert. (dies eventuell alle 2-3 Sek. testen lassen.)

      Was redest du da. Guck dir mal http://aktuell.de.selfhtml.org/jibbet-nich an: Wo siehst du da eine 404 im Titel? (IE zählt nicht, bei dem weiß man nie). Die 404 wird _manchmal _ in den vom Server generierten Dokumenten als Teil des Titels verwendet, eine Abfrage nach dem Inhalt des Titels ist dennoch vollkommen sinnlos. Mal ganz davon abgesehen gibt es auch Seiten, die keine Fehlerseiten sind, und bei denen trotzdem 404 im Titel vorkommt.

      Ich werde mich mal ransetzten und etwas schreiben, wenn ich erfolgreich bin
      gibts bald ein wenig Code an die Hand.

      Mach dir nicht die Mühe, daran kann man es nicht erkennen.

      Schöne Grüße

      Johannes

      --
      ss:| zu:) ls:[ fo:) de:] va:) ch:? sh:( n4:& rl:( br:< js:| ie:{ fl:( mo:}
      1. Hallo Johannes,

        hast Recht. interessant ist es aber doch, da mit hilfe des Scripts garantiert
        der grösste Teil von Fehlerhaften Seiten  abgefangen werden kann.
        Ist halt eine Frage des Nutzens, will man 90% der Fehlerhaften Seiten
        abfangen sollte das Script reichen. Man könnte die Fehlerabfrage auch erweitern,
        allerdings besteht dann die Möglichkeit, das mehr eigentlich Richtige Seiten dann
        auch umgeleitet werden.
        Kommt halt auf den Einsatzzweck an.

        Ich schreibe das Script trotzdem mal, vielleicht kann man es ja gebrauchen.

        Tschö
        Sascha

      2. aber das .../jibbet-nich ist doch über php oder anderes abgefangen und schon eine Fehlerseite. Was er will, ist doch eher, dass eine Seite abgefangen wird, die es gar nicht gibt oder die defekt ist; aber nicht eine Fehlerseite abfangen!!!!?!?

        1. Hallo Christoph (</faq/#Q-05a>)

          aber das .../jibbet-nich ist doch über php oder anderes abgefangen und schon eine Fehlerseite.

          Wenn der Client vom Server eine Resource anfordert, die dieser nicht ausliefert, sendet er in seiner Antwort als Statuscode 404 Not Found und ein paar Header zurück. Er kann aber auch im Body etwas mitsenden, das statt der nicht gefundenen Seite dargestellt wird. Beim Apache ist diese Nachricht, sofer nicht anders überschrieben, AFAIK fest eingebaut. Aber schreib mal in eine .htaccess

          ErrorDocument 404 "

          und versuch dann eine Seite abzurufen, die nicht vorhanden ist. Du kannst also nie davon ausgehen, dass eine Fehlerseite mitgesendet wird.

          Was er will, ist doch eher, dass eine Seite abgefangen wird, die es gar nicht gibt oder die defekt ist; aber nicht eine Fehlerseite abfangen!!!!?!?

          Ja, Hans Thomas will, wie er in [pref:t=49637&m=271365] gesagt hat, aus einem Frame heraus überprüfen, ob in einem anderen Frame die Seite nicht gefunden, also der Status der Server-Antwort 404 Not Found ist.

          Schöne Grüße

          Johannes (</faq/#Q-05c>)

          --
          ss:| zu:) ls:[ fo:) de:] va:) ch:? sh:( n4:& rl:( br:< js:| ie:{ fl:( mo:}
  4. Wie Versprochen das Script, läuft ganz gut aber der einsatzt ist halt abzuwägen:

    ----------------------------------------------------------------------------------
    File:"index.html"
    ----------------------------------------------------------------------------------
    <title>Site not found abfangen</title>
    <!-- frames -->
    <frameset  cols="18%,*">
        <frame name="menue" src="menue.html" marginwidth="10" marginheight="10" scrolling="auto" frameborder="0">
        <frame name="main" src="main.html" marginwidth="10" marginheight="10" scrolling="auto" frameborder="0">
    </frameset>

    ----------------------------------------------------------------------------------
    File:"menue.html"
    ----------------------------------------------------------------------------------
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
     <title>Site not found abfangen</title>
    <script type="text/javascript">
    <!--
    function checkTitel() {
    // Sehr simpel gestricktes Script zum dynamischen Abfangen von Fehlerhaften Seiten
    // benötigt evtl. noch einiges an Anpassung
     var titelzeile;
     var fehler=-1;
     var umleitung=0;
     titelzeile=parent.main.document.title;
    // Ab hier werden nacheinander verschiedene Fehlerkennungen durchgearbeitet
    // Achtung, je mehr Kennungen durchgefragt werden, um so mehr werden auch eigendlich
    // richtige Links umgeleitet.
    // Einzig Sinnvoll sind nur die Kennungen "404", "Error" und "Fehler"
     fehler = titelzeile.search(/404+/);
     if(fehler != -1) umleitung=1;
     fehler = titelzeile.search(/Error+/);
     if(fehler != -1) umleitung=1;
     fehler = titelzeile.search(/Fehler+/);
     if(fehler != -1) umleitung=1;
     if(umleitung>0) {
      alert("Fehlerkennung im Titel gefunden.\n Sie werden umgehend umgeleitet.");
      parent.main.location.href="fehler.html";
     }
     window.setTimeout("checkTitel()",1200);
    }
    //-->
    </script>

    </head>
    <body onLoad="javascript:checkTitel()">
    <a href="test.html" target="main">Auf Fehler laufen</a>
    </body>
    </html>

    ----------------------------------------------------------------------------------
    File:"fehler.html"
    ----------------------------------------------------------------------------------
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
     <title>Abgefangen</title>
    </head>
    <body>
    Es scheint geklappt zu haben, es wurde ein Fehler gefunden.<br>
    Und ich wurde aufgerufen. Cooooooool.
    </body>
    </html>

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

    Viel Spass beim ausprobieren

    Tschö
    RatzeP

    1. Moin!

      Wie Versprochen das Script, läuft ganz gut aber der einsatzt ist halt abzuwägen:
      Viel Spass beim ausprobieren

      Dein Skript macht nichts anderes, als man mit der Apache-Direktive "ErrorDocument" auch erreichen könnte: Wenn eine Seite nicht gefunden wird, kann man auch eine selbstdefinierte Seite senden.

      Dies kann man schön machen, indem zur gleichbleibenden URL Statuscode 404 gesendet wird (die selbstdefinierte Fehlerseite ist also unter der nichtvorhandenen URL zu sehen), oder man regelt es so, dass ein Redirect auf die Fehlerseite erfolgt (was nicht gut ist, weil auch Suchmaschinen dann keinen 404 mehr erhalten, sondern einen Redirect - und Linkchecker, die nach 404 suchen, finden den broken link nicht mehr).

      Was aber absolut nicht geht, ist der Einsatz deines Skriptes offline (was Hans in  [pref:t=49637&m=271424] gefordert hatte). Wenn der Browser lokal nichts von Festplatte laden kann, existiert kein Server, der statt der nichtvorhandenen Datei einfach eine andere Seite schickt (deren Titel man auswerten kann), sondern der Browser wird eine eklige, nicht abfangbare Fehlermeldung ausgeben, dass die Seite nicht geladen werden konnte, und dann im vorherigen Zustand verharren.

      Man kann die Ausgangsfrage "Wie kann ich den 404 mit Javascript _ABFANGEN_" wirklich zu 100% komplett mit "Das geht nicht" beantworten. Denn "abfangen" bedeutet für mich: Verhindern, dass er überhaupt auftritt. Das ist definitiv unmöglich.

      Man kann, sofern ein Server existiert und einen 404-Statuscode mit selbstdefinierter Fehlerseite ausgibt, auf dieser Fehlerseite aber beliebiges Javascript integrieren, welches im Fehlerfall _reagieren_ kann. in location.href steht die fehlerhafte, nicht gefundene URL drin (sofern kein Redirect auf die Fehlerseite konfiguriert wurde - dann steht natürlich immer die URL der Fehlerseite drin, was ziemlich langweilig wäre), mit der man mittels Javascript vielleicht einiges machen kann. Was genau das sein könnte, hat Hans ja nicht gesagt.

      - Sven Rautenberg

      --
      ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|