404 - Fehler abfangen
Hans Thomas Vogler
- javascript
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.
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?? :-)
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.
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
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
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
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
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.
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
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
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
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
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
»» 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.. :-)
mit JS machste das.... bestimmt nicht lalala.. :-)
Du vielleicht nicht - ich schon :-)
servus,
T.
Hi Han Thomas,
Du vielleicht nicht - ich schon :-)
Das will ich sehen - es ist nämlich schlichtweg unmöglich.
Gruss,
Carsten
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.
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
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
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
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
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!!!!?!?
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>)
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
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