So erhalten Sie URL-Hash (#) von der Serverseite

133

Ich weiß, dass Sie auf der Clientseite (Javascript) windows.location.hash verwenden können, aber ohnehin keinen Zugriff von der Serverseite finden konnten.

Ricky Supit
quelle
Haben Sie einen Weg gefunden, um dieses Problem zu umgehen? Ich habe Lesezeichen mit has in der URL und möchte nach dem Hash auf der Serverseite auf den Text zugreifen.
Dotnetcoder
Die Antworten erklären, dass dies auf dem Server nicht verfügbar ist, da es nur vom Benutzeragenten interpretiert wird. Ich habe versucht, die aktive Registerkarte zu ändern, was ich auf der Serverseite versucht habe. Ich habe es stattdessen auf der Client-Seite gemacht.
Ricky Supit

Antworten:

134

Wir hatten eine Situation, in der wir den URL-Hash über ASP.Net-Post-Backs hinweg beibehalten mussten. Da der Browser den Hash standardmäßig nicht an den Server sendet, können Sie nur Javascript verwenden:

  1. Wenn das Formular gesendet wird, greifen Sie zu hash ( window.location.hash) und speichern Sie es in einem serverseitigen versteckten Eingabefeld. Geben Sie dies in ein DIV mit der ID " urlhash" ein, damit wir es später leicht 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 sollten es bei dem DIV finden, in dem es enthalten ist, da die automatisch generierte ID nicht bekannt ist. Ja, Sie könnten hier mit .ClientID einige Tricks machen, aber wir fanden es einfacher, nur den Wrapper DIV zu verwenden, da all dieses Javascript in einer externen Datei leben und generisch verwendet werden kann.

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

Wir haben jQuery verwendet, um die Auswahl des Felds usw. zu vereinfachen. Alles in allem handelt es sich um ein paar jQuery-Aufrufe, einen zum Speichern des Werts und einen zum Wiederherstellen des Werts.

Vor dem Absenden:

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

Laden auf 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 möchten.

Stellen Sie außerdem sicher, dass Sie verwenden $(document).ready() angemessen verwenden.

Chris
quelle
4
Tolle Lösung, aber was ist mit GET-Anfrage?
Hexenmeister
2
@Chris - Aber wie wird das Formularübermittlungsereignis aufgerufen, wenn Sie die URL einfach in einen anderen Browser einfügen (weil es sich nur um eine GET-Anforderung handelt)?
KrishPrabakar
@ Warlock, unabhängig von get / post funktioniert es, da Sie den Hash in einem versteckten Feld speichern.
KMX
83

RFC 2396 Abschnitt 4.1:

Wenn eine URI-Referenz zum Ausführen einer Abrufaktion für die identifizierte Ressource verwendet wird, besteht die optionale Fragmentkennung, die durch ein Schraffurzeichen ("#") vom URI getrennt ist, aus zusätzlichen Referenzinformationen , die vom Benutzeragenten nach dem Abrufen interpretiert werden Aktion wurde erfolgreich abgeschlossen . Als solches ist es nicht Teil einer URI, sondern wird häufig in Verbindung mit einer URI verwendet.

(Betonung hinzugefügt)

Mauricio Scheffer
quelle
3
Ich bin überrascht. Ich habe viel über SPA gelesen und wusste das nicht. Der Browser sendet also so viele vertrauliche Informationen, aber nicht den Hash? Ich denke es sollte in die Zukunft gehen .. zumindest als separater HTTP-Header. Dies ist verwandt: onebigfluke.com/2015/01/…
Bodrin
42

Das liegt daran, dass der Browser diesen Teil nicht an den Server überträgt.

Julien Oster
quelle
7

Wahrscheinlich besteht die einzige Möglichkeit darin, es auf der Clientseite zu lesen und manuell auf den Server zu übertragen (GET / POST / AJAX). Grüße Artur

Möglicherweise sehen Sie auch, wie Sie mit der Zurück-Schaltfläche und dem Browserverlauf bei Malcan spielen


quelle
3

Um die Möglichkeit auszuschließen, dass Sie nicht wirklich versuchen, das Fragment auf einem GET / POST zu sehen, und tatsächlich wissen möchten, wie Sie auf den Teil eines URI-Objekts zugreifen können, den Sie in Ihrem serverseitigen Code haben, befindet es sich unter Uri.Fragment ( MSDN-Dokumente ).

Patridge
quelle
8
IE8, Chrome und Firefox senden den Hash nicht an den Server. Daher ist das Uri.Fragment immer eine leere Zeichenfolge, wenn Sie die serverseitige Seite von Request.Url.Fragment untersuchen (wie in den obigen Antworten angegeben).
zcrar70
0

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

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

Rufen Sie diese Funktion oben am Controller auf 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");
    }
}
Webaholik
quelle