Warum ist der Hash-Teil der URL auf der Serverseite nicht verfügbar?

Zum Beispiel, wenn ich die URL eintippe:

http://www.foo.com/page.php?parameter=kickme#MOREURL

Dann auf dem Server gibt es keinen Teil: #MOREURL

Ist es möglich, diese Teile ohne jQuery AJAX an den Server zu senden oder zu bekommen?

Nein, es ist nur für den Browser verfügbar , also müssen Sie es mit Javascript zu tun haben. Der Server kann es nicht lesen.

Erläuterung:
Grundsätzlich wird die Hash-Komponente der Seiten-URL (der Teil, der dem # -Zeichen folgt) nur vom Browser verarbeitet – der Browser gibt sie niemals an den Server weiter. Dies ist leider Teil des HTML-Standards und ist der gleiche, egal ob Sie IE oder einen anderen Browser verwenden (und in diesem Fall PHP oder eine andere serverseitige Technologie).

Hier ist, was Wikipedia dazu sagt:

Die Fragmentkennung funktioniert anders als der Rest der URI: Ihre Verarbeitung erfolgt nämlich ausschließlich clientseitig ohne Teilnahme des Servers . Wenn ein Agent (z. B. ein Webbrowser) eine Ressource von einem Webserver anfordert, sendet der Agent den URI an den Server, sendet das Fragment jedoch nicht. Stattdessen wartet der Agent darauf, dass der Server die Ressource sendet, und anschließend verarbeitet der Agent die Ressource gemäß dem Fragmentwert. Im häufigsten Fall scrollt der Agent eine Webseite bis zum Ankerelement, das eine Attributfolge hat, die dem Fragmentwert entspricht. Andere Clientverhalten sind möglich

http://tools.ietf.org/html/rfc2396#section-4

Wenn eine URI-Referenz verwendet wird, um eine Abrufaktion für die identifizierte Ressource auszuführen, besteht die optionale Fragmentkennung, die durch ein Kreuzschraffurzeichen (“#”) vom URI getrennt ist, aus zusätzlichen Referenzinformationen, die vom Benutzeragenten nach dem Abruf interpretiert werden Aktion wurde erfolgreich abgeschlossen. Daher ist es nicht Teil eines URI, sondern wird oft in Verbindung mit einem URI verwendet.

Da der Browser den Hash-Wert standardmäßig nicht an den Server sendet, kann dies nur mit ein wenig Javascript geschehen:

  1. Wenn das Formular übermittelt wird, schnapp dir den Hash (window.location.hash) und speichere ihn in einem versteckten Eingabefeld auf der Serverseite. Setze das in ein DIV mit der ID “urlhash”, damit wir es später leichter finden können.

  2. Auf dem Server können Sie diesen Wert verwenden, wenn Sie etwas damit tun müssen. Sie können es sogar ändern, wenn Sie müssen.

  3. Überprüfen Sie beim Laden der Seite auf dem Client den Wert dieses ausgeblendeten Felds. Sie werden es nach dem DIV suchen, in dem es enthalten ist, da die automatisch generierte ID nicht bekannt sein wird. Ja, Sie könnten hier einige Tricks mit .ClientID machen, aber wir fanden es einfacher, nur das Wrapper-DIV zu verwenden, da es all diesem Javascript ermöglicht, in einer externen Datei zu leben und in einer generischen Art und Weise verwendet zu werden.

  4. Wenn das ausgeblendete Eingabefeld einen gültigen Wert hat, legen Sie das als URL-Hash (window.locaion.hash) fest und / oder führen Sie andere Aktionen aus.

Wir haben jQuery verwendet, um die Auswahl des Felds zu vereinfachen, usw. Alles in allem sind es einige jQuery-Aufrufe, eine zum Speichern des Werts und eine weitere zum Wiederherstellen.

Vor dem Einreichen:

 $("form").submit(function() { $("input", "#urlhash").val(window.location.hash); }); 

Beim Laden der Seite:

 var hashVal = $("input", "#urlhash").val(); if (IsHashValid(hashVal)) { window.location.hash = hashVal; } 

IsHashValid () kann nach “undefined” oder anderen Dingen suchen, die Sie nicht behandeln wollen.

Stellen Sie sicher, dass Sie natürlich auch $ (document) .ready () verwenden.

Ich möchte die Antwort auf den Grund erweitern, warum das Fragment nicht an den Server gesendet wird. Weil es absichtliches und erwünschtes Verhalten ist. Sehen wir uns die gesamte URL-Zeichenfolge an.

/path/to/element?query=string&for=server#?optional=fragment&for=browser < ----- URI ----> < ---- QUERY STRING ---> < ----- FRAGMENT STRING ------>

URI gibt eindeutig die Ressource an, die von einem Server abgerufen wird

QUERY definiert Operationen, die vom Server auf der Ressource ausgeführt werden

FRAGMENT steuert das Browser- (Anwendungs-) Verhalten. Fragment sollte verwendet werden, um den Anwendungsstatus zu speichern, der für den Benutzer sichtbar sein sollte, damit der Benutzer den Link an einen anderen Benutzer senden kann, um denselben Anwendungsstatus zu erhalten.

Fragment ist der einzige Teil von URL, der für Sie transparent ist, um einseitige Webanwendungen transparent zu machen (die z. B. offline auf Ihrem Mobiltelefon ausgeführt werden können). Daher muss es nicht an den Server gesendet werden.