webentwicklung-frage-antwort-db.com.de

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

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

130
Ricky Supit

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

  1. Wenn das Formular gesendet wird, nehmen Sie den Hash (window.location.hash) Und speichern Sie ihn in einem serverseitigen versteckten Eingabefeld. Fügen Sie diesen in eine DIV mit der ID "urlhash" ein, damit wir ihn leichter finden können später.

  2. Auf dem Server Sie können 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 an der DIV suchen, in der es enthalten ist, da die automatisch generierte ID nicht bekannt ist. Ja, mit .ClientID könnten Sie hier einige Tricks anstellen, aber wir fanden es einfacher, nur den Wrapper DIV zu verwenden, da dies alles ermöglicht, dass Javascript in einer externen Datei gespeichert und allgemein verwendet wird .

  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 Feldes usw. zu vereinfachen. Alles in allem sind es ein paar jQuery-Aufrufe, einer zum Speichern des Werts und ein weiterer zum Wiederherstellen.

Vor dem Absenden:

$("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 bearbeiten möchten.

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

131
Chris

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 ("#") von der URI getrennt ist, aus zusätzlichen Referenzinformationen für vom Benutzerprogramm interpretiert werden, nachdem die Abrufaktion erfolgreich abgeschlossen wurde . Als solches ist es kein Teil eines URI, wird aber häufig in Verbindung mit einem URI verwendet.

(Betonung hinzugefügt)

79

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

41
Julien Oster

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

Sie können auch sehen, wie man mit der Schaltfläche "Zurück" und dem Browserverlauf spielt bei Malcan

7
Artur

Um die Möglichkeit auszuschließen, dass Sie nicht 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, der sich in Ihrem serverseitigen Code befindet, finden Sie ihn unter Uri.Fragment ( MSDN docs ).

3
patridge

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

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

Rufen Sie diese Funktion oben auf dem 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");
    }
}
0
webaholik