Moin nochmal!
hier ist mein Quelltext (ist für eine Fehlerseite, d.h. wenn man eine falsche URL eingibt, erscheint per .htaccess diese Seite hier und die gibt ähnliche Links, die in einem Array gespeichert sind, aus):
Dazu fallen mir zwei Dinge ein:
1. Es gibt ein Apache-Modul namens "mod_speling". Das versucht, kleine Tippfehler (ein Zeichen falsch, zuviel oder weggelassen) zu korrigieren und eine passende Seite auszugeben. Bei mehreren Alternativen wird eine Auswahlliste angezeigt. Du solltest schauen, ob das Modul auch bei deinem Webserver installiert und benutzbar ist - spart dir nämlich eine ganze Menge Arbeit.
2. Wenn es um URLs geht, dann fallen mir im Grunde zwei typische Tippfehlermöglichkeiten ein:
a) Falsche Groß/Kleinschreibung.
b) Falsche Dateiendung (.htm statt .html z.B.)
Das bedeutet, du hat, bevor du dich auch nur irgendwie um Ähnlichkeiten kümmern mußt, schon mal zwei Ansätze, die möglicherweise erfolgversprechender sind. Denn wenn eine komplett großgeschriebene URL nicht existiert, sondern kleingeschrieben werden muß, dann würde praktisch garkeine Ähnlichkeit festgestellt werden, weil alle Buchstaben ausgetauscht werden müßten - jedenfalls, wenn man die Ähnlichkeit falsch auffaßt und große und kleine Buchstaben als "unterschiedlich" definiert.
Ganz grundsätzlich würde ich dein Problem aber keinesfalls mit Javascript lösen wollen!
Warum nicht? Erstens hast du mit Javascript nur die Informationen, welche du explizit ins Skript schreibst. Wenn du also eine Liste der verfügbaren Dateien haben willst, mußt du die extra in ein Array eintragen - und das Array aktuell halten! Jede Änderung in den Verzeichnissen erfordert eine Änderung im Array. Das ist bei einer kleinen Site (10 Seiten) nicht aufwendig, aber bei einer großen Site (denke da auch an die Ladezeit für die Fehlerseite). Bei einer kleinen Site brauchst du aber nicht diese aufwendige Fehlerbehandlung - da reicht es aus, einfach die vorhandene Navigation anzubieten, mit der man auf jede beliebige Seite gelangen kann. Und falls innerhalb der Site fehlerhafte Links sind, müssen die natürlich repariert werden (dazu die LÖogfiles auswerten). Bei einer großen Site hingegen wird das Javascript möglicherweise ewig vergleichen - da ist der User schon dreimal weiter, wenn er einfach die Navigation benutzt. Mit serverseitigen Skripten könntest du einfach eine Liste der Dateien einlesen, die aktuell vorhanden sind, und dann vergleichen - in PHP sogar mit den passenden Funktionen levenshtein() oder similar_text().
Zweitens könntest du auf dem Server (wenn du es denn könntest) eben mit mod_speling oder schlauen anderen Methoden (z.B. mittels mod_rewrite) solange an der URL rumändern, bis eine passende Seite gefunden wird. Taktik z.B.: wenn /pfad1/pfad2/seite1.html nicht gefunden wird, dann wird auf /pfad1/pfad2/index.html zurückgegriffen, ansonsten auf /pfad1/index.html, und notfalls auf /index.html.
Drittens: Du könntest natürlich auch versuchen, eine Site-interne Suchmaschine zu füttern, und aus den Begriffen der URL passende Suchbegriffe bilden.
Ich weiß schon, daß dich das alles nicht weiterbringt, will es aber trotzdem gesagt haben - die Antwort kommt schließlich ins Archiv.
Was bleibt als Javascript-Lösungsmöglichkeit:
Nutze zuerst nach Möglichkeit die Merkmale deiner URLs, die eindeutig und einheitlich sind.
Wenn alle URLs nur Kleinbuchstaben verwenden, dann konvertiere die eingegebene URL vor jedem anderen Vergleich erst in Kleinbuchstaben - vielleicht ist das schon der Fehler gewesen, und du erhälst dadurch einen eindeutigen Treffer.
Wenn du immer .html verwendest, prüfe, ob das in der eingegebenen URL auch verwendet wurde, ansonsten korrigiere und prüfe, ob diese neue URL existiert.
Trenne den Dateinamen hinten ab und prüfe, ob in dem angeforderten Verzeichnis Dateien existieren, welche mit dem Dateinamen oder einem Teil davon vorne anfangen. Wenn also seite1.html gewünscht wurde, aber nicht existiert, dann prüfe, ob seite1*, seite*, seit*, sei*, se* oder s* existieren. Prüfe auch, ob *seite1*, *seite*... existieren (also vorne Zeichen fehlen). Logisch, daß mit fortscheitender Verfremdung die Übereinstimmung immer weniger werden sollte. :)
Bedenke bei all den Methoden aber eines: Ein Computer kann nur anhand gewisser Regeln Übereinstimmungen feststellen - er kann aber niemals Übereinstimmungen _erkennen_, so wie es ein Mensch kann. Uns ist auf den ersten Blick klar, daß /begrüßung/willkommen.html und /begruessung/hallo.htm irgendwie ähnlich sind. Vor allem, wenn wir die restlichen Dateien und deren Inhalt kennen, aber keine andere als die hallo.htm eine Begrüßung enthält, und willkommen.html garnicht existiert. Der Computer aber "sieht" nichts.
Insofern halte ich deine Herangehensweise für Overkill und nicht zweckdienlich zugleich.
Overkill, weil du versuchst, den Computer mit menschlicher Intelligenz zu versehen (und das mit Javascript - die Quadratur des Kreises ist leichter als das ;) ).
Nicht zweckdienlich, weil das mögliche Resultat nicht besser sein muß, als einfach eine Liste aller im angesprochenen Verzeichnis vorhandenen Dateien auszugeben, wenn die konkrete Datei nicht gefunden wurde.
Wenn du die gewünschte URL nach deinen Dateinamenskonventionen (also immer .html, immer kleingeschrieben) umgewandelt hast und keinen Treffer findest (den könntest du dann per Link, oder noch besser: Direkt per Weiterleitung ausgeben), dann ist alles weitere nur Voodoo.
Mag sein, daß ich das zu pessimistisch sehe, aber ich erwarte in der Regel von einer 404-Seite nicht, daß sie mittels Javascript errät, was ich wollte. Schlimm genug, daß sie überhaupt erscheint, aber dann ist das Vorhandensein der Sitenavigation wichtiger, als die möglichen Links. Meistens verlasse ich solche Seiten auch wieder mit dem "Zurück"-Button, weil ich dann doch lieber dort weitermache, wo ich hergekommen bin.
- Sven Rautenberg