2008-11-25 7 views
120

Ich weiß auf Client-Seite (Javascript) können Sie windows.location.hash verwenden, konnte aber trotzdem nicht finden, um von der Server-Seite zuzugreifen.Wie bekomme ich Url Hash (#) von der Server-Seite

+0

haben Sie einen Weg aruond dieses Problem, ich habe Lesezeichen mit hat in der URL und wollen auf den Text nach Hash auf der Serverseite zugreifen? – dotnetcoder

+0

Die Antworten erklären, dass dies auf dem Server nicht verfügbar ist, da nur von User Agent interpretiert wird. Ich habe versucht, den aktiven Tab zu ändern, was ich auf Server-Seite versucht habe. Am Ende habe ich es stattdessen auf der Clientseite gemacht. –

+0

Mögliches Duplikat von [Kann ich den Hash-Teil der URL auf meiner serverseitigen Anwendung (PHP, Ruby, Python usw.) lesen?] (Http://stackoverflow.com/questions/940905/can-i-read -the-hash-portion-von-der-url-auf-meinem-server-side-application-php-ruby) –

Antwort

124

Wir hatten eine Situation, in der wir den URL-Hash über ASP.Net Postbacks beibehalten mussten. Da der Browser die einzige Möglichkeit, nicht den Hash an den Server standardmäßig zu senden, es zu tun ist, einige Javascript zu verwenden:

  1. Wenn das Formular abschickt, den Hash greifen (window.location.hash) und speichern sie in einem Server verstecktes Eingabefeld Fügen Sie dieses in ein DIV mit der ID "urlhash" ein, 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 erlaubt, 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 dies als URL-Hash (window.location.hash again) fest und/oder führen Sie andere Aktionen aus.

Wir haben jQuery die Auswahl des Feldes zu vereinfachen, etc ... alles in allem es am Ende ein paar jQuery nennt man sein, um den Wert zu speichern, und eine andere, um sie wiederherzustellen.einreichen

Bevor:

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

Auf Seite zu laden:

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

IsHashValid() können überprüfen, für "undefined" oder andere Dinge, die Sie nicht wollen, zu behandeln.

Auch, stellen Sie sicher, dass Sie $(document).ready() entsprechend verwenden, natürlich.

+4

Große Lösung, aber was ist GET-Anfrage? – Warlock

+2

Ohne get Anfragen diese Lösung ist nichts .. –

+2

@Chris - Aber wie form-submit-Ereignis wird aufgerufen, wenn Sie einfach die URL in einem anderen Browser einfügen (weil es nur eine GET-Anfrage ist)? – KrishPrabakar

36

Das ist, weil der Browser diesen Teil nicht an den Server überträgt, sorry.

75

RFC 2396 Abschnitt 4.1:

Wenn eine URI Referenz eine Abrufaktion auf der identifizierten Ressource auszuführen verwendet wird, die optionalen Fragmentbezeichner, getrennt von die URI von einer Kreuzschraffur („#“) Zeichen , besteht aus zusätzlichen Referenzinformationen , die vom Benutzeragenten interpretiert werden, nachdem die Abrufaktion erfolgreich abgeschlossen wurde. Als solches ist es nicht Teil eines URI, wird aber oft in Verbindung mit einem URI verwendet.

(Hervorhebung hinzugefügt)

+2

Ich bin überrascht. Ich habe viel über SPA gelesen und wusste das nicht. Also sendet der Browser so viele sensible Informationen, aber nicht den Hash? Ich denke es sollte in die Zukunft gehen .. zumindest als separater HTTP-Header. Das ist verwandt: http://www.onebigfluke.com/2015/01/experimentally-verified-why-client-side.html?m=1 – bodrin

7

Wahrscheinlich die einzige Wahl, um es auf der Client-Seite zu lesen ist und übertragen sie manuell auf den Server (GET/POST/AJAX). Grüße Artur

Sie sehen auch, wie mit Zurück-Taste und Browser-History at Malcan

3

einfach zu spielen, um die Möglichkeit auszuschließen, Sie sind nicht wirklich das Fragment auf einem GET/POST, um zu sehen versuchen und tatsächlich Sie möchten wissen, wie Sie auf diesen Teil eines URI-Objekts zugreifen können, das Sie in Ihrem serverseitigen Code haben, und zwar unter Uri.Fragment (MSDN docs).

+7

IE8, Chrome und Firefox alle werden nicht den Hash an den Server senden; Also, die Uri.Fragment ist immer eine leere Zeichenfolge, wenn Sie Request.Url.Fragment Server-Seite (wie die Antworten oben) überprüfen. – zcrar70

0

Mögliche Lösung für GET-Anfragen:

Neuer Link Format: http://example.com/yourDirectory?hash=video01

Rufen Sie diese Funktion in Richtung Oberseite des Controllers oder http://example.com/yourDirectory/index.php:

function redirect() 
{ 
    if (!empty($_GET['hash'])) { 
     /** Sanitize & Validate $_GET['hash'] 
       If valid return string 
       If invalid: return empty or false 
     ******************************************************/ 
     $validHash = sanitizeAndValidateHashFunction($_GET['hash']); 
     if (!empty($validHash)) { 
      $url = './#' . $validHash; 
     } else { 
      $url = '/your404page.php'; 
     } 
     header("Location: $url"); 
    } 
}