Warum URI-codierte ('#') Anker 404 verursachen und wie man damit in JS umgehen kann?

8

prettyPhoto verwendet Hashtags, aber wenn sie verschlüsselt werden ( bis% 23), die meisten Browser zeigen einen 404 Fehler an. Diese wurde bereits zuvor diskutiert :

  

Sie erhalten einen 404 Fehler, weil der #callback Teil nicht Teil der URL ist.   Es ist ein Lesezeichen, das vom Browser verwendet wird und niemals gesendet wird   die Anfrage an den Server. Wenn Sie den Hash codieren, wird er Teil von   der Dateiname stattdessen.

  1. Warum wird ein Hash nur dann Teil der Datei, wenn er URI-codiert ist? Ist es nicht ein Fehler?

  2. Ich frage, weil prettyPhoto Hashtags verwendet und leidet aus dem gleichen Problem. Ich denke, ein '?' bevor der Hash die eleganteste Lösung ist, bin ich nur ein bisschen wie ich es im bestehenden Code machen kann:

    %Vor%
  3. Irgendwelche anderen Vorschläge? Ich werde versuchen, meine 404-Seite zu optimieren, aber das scheint eher ein Problem zu behandeln als es zu verhindern.

Danke!

BEARBEITEN: Da es mit der Art und Weise, wie prettyphoto diese Hashes behandelt, offensichtlich nichts zu tun hat, habe ich diese Regeln zu meinem Apache-Server hinzugefügt:

%Vor%

Sie verarbeiten erfolgreich die Fälle, in denen% 23 Probleme verursacht hat.

    
Drew 20.07.2012, 22:28
quelle

2 Antworten

7
  
  1. Warum würde ein Hash nur ein Teil der Datei werden, nur weil er URI-codiert ist? Ist es nicht ein Fehler?
  2.   

Wenn Sie mit Ihrem Browser auf http://example.com/index.html#title , der Browser diese interpretiert eine Anfrage für die Datei index.html vom Server example.com zu machen. Sobald die Anforderung abgeschlossen ist, sucht der Browser für ein Ankerelement in dem Dokument mit dem Namen ‚title‘ (das heißt Mein Titel).

Wenn Sie stattdessen verweisen auf http://example.com/index.html%23title , macht der Browser eine Anfrage für die Datei index.html%23 von example.com , was wahrscheinlich auf dem Server nicht vorhanden ist, so dass Sie ein 404. Sehen Sie den Unterschied?

Und es ist kein Fehler. Es ist Teil einer l ast Internet-Standard aktualisiert in 1998. Siehe RFC 2396 . Zitat:

  

Das Zeichen "#" ist ausgeschlossen, weil sie eine URI von einem Fragment Identifier URI in Referenzen (Abschnitt 4).

abgrenzen verwendet wird

Wie für 2 und 3 gibt es nicht genügend Kontext in Ihrem Beispielcode, um zu sagen, was Sie zu tun versuchen. Wie rufst du deinen Code an? Was versuchst du mit prettyphoto zu machen, das nicht funktioniert? Versuchen Sie, von einem Nutzerklick oder einem anderen JavaScript-Ereignis zu einem bestimmten Foto oder einer bestimmten Galerie umzuleiten? Versuchen Sie, die Galerie zu öffnen, wenn jemand eine bestimmte Seite besucht?

Ich habe die verknüpfte Frage mit twitter / oauth überprüft, aber ich sehe nicht, wie das mit dem Code zusammenhängt, den Sie angegeben haben. Ich fing an, auch auf prettyphoto herumzustochern, aber ich sehe auch nicht, wie sich dein Code darauf bezieht.

Stattdessen Ihre 404 Seite zu verändern, vielleicht, was Sie brauchen, ist eine in-Code-Handler oder Server-Rewrite-Regel, die in ihnen nicht gefunden Anfragen mit einem %23 nimmt und leitet den Benutzer auf das decodierte URL. Das könnte einige Nachteile haben, aber es wäre ziemlich elegant, wenn Sie eingehende Anfragen aus anderen Quellen übernehmen, die Sie nicht kontrollieren können. Was ist Ihre Serverumgebung? (Sprache, Server Tech, wem gehört die Maschine usw.)

Ich würde gerne meine Antwort mit einer Lösung oder einer Arbeit für Sie aktualisieren.

    
Patrick M 20.07.2012, 23:47
quelle
2

Um # 1) zu beantworten

Es würde ein Teil der URL werden, weil es nicht länger ein Token ist, das der Browser / Server / etc parsen kann.

Was ich meine ist das "?" spielt eine wichtige Rolle in URLs - der Server weiß, was vor und was danach ist. Der Browser muss sich nicht darum kümmern, was im URI dynamisch ist oder nicht - es ist alles von Bedeutung (obwohl JavaScript die Werte im Standortobjekt trennt).

Der Browser sendet "# ......" nicht an den Server, da der Hashtag spezielle Konnotationen für den Browser hat.

Wenn Sie jedoch diesen Hash in JavaScript umgehen, wird der Browser nicht zögern, diese Escape-Zeichenfolge als Literalwert an den Server zu senden.

Warum nicht? Wenn Ihre Suchanfrage rechtmäßig ein Hash-Zeichen benötigt (Sie machen eine POST-Anfrage an eine Facebook-Seite, und Sie reichen eine Telefonnummer ein), dann wären Sie geschraubt. Oder du machst eine GET-basierte Suche nach einer Nummer auf 411.com oder was auch immer, und sie haben ihre Bewerbung nicht wirklich durchdacht.

Das Problem ist, dass der Server nicht verstehen wird, dass der maskierte Wert getrennt von der URL gehalten werden soll, wenn er im tatsächlichen Pfad auftritt.

Es muss Zeichen mit Escape-Zeichen akzeptieren, sonst würden Leerzeichen (% 20) und andere Alltagszeichen, die ansonsten in Dateinamen / Pfaden / Abfragen / Werten gültig sind, Probleme bereiten.

Wenn Sie also nach:

suchen %Vor%

Wahrlich, Sie werden sicherlich 404.

Es gibt ein paar Dinge, die Sie tun könnten, da bin ich mir sicher. Der erste wäre in Apache, oder was auch immer Sie bedienen, Sie könnten eine RegEx schreiben, die mit jeder URL bis zur ersten "% 23" übereinstimmt, vorausgesetzt, dass es kein "?" vorher.

Weniger intuitive Implementierungen können beinhalten, herauszufinden, ob es eine Möglichkeit gibt, den "#" zu entkommen, die Plug-in-freundlich sind.

Google verwendet zum Beispiel eine "Hash-Bang" -Strategie ("#!"), in der es darum bittet, dass URLs auf diese Weise eingereicht werden, um zu wissen, ob sie verschlüsseln sollen oder nicht.

Andere Optionen könnten sein, nach einem "#" Zeichen zu suchen, indem Sie url.indexOf("#"); verwenden und die URL im Hash aufteilen und den gültigen Teil einreichen.

Es kommt wirklich darauf an, was Sie erreichen wollen - ich kann darauf hinweisen, warum es ein Problem ist, aber wie Sie es am besten zu einem Nicht-Problem machen, hängt davon ab, was Sie versuchen, wie Sie es tun versuche es, und was in dem Kontext erlaubt ist, in dem du arbeitest.

    
Norguard 21.07.2012 00:04
quelle

Tags und Links