Jak uzyskać Url Hash (#) ze strony serwera

133

Wiem, że po stronie klienta (javascript) możesz użyć windows.location.hash, ale i tak nie możesz znaleźć dostępu od strony serwera.

Ricky Supit
źródło
czy znalazłeś sposób na ten problem, mam zakładki z ma w adresie URL i chcesz uzyskać dostęp do tekstu po haszu po stronie serwera?
dotnetcoder
Odpowiedzi wyjaśniają, że nie jest to możliwe na serwerze, ponieważ jest interpretowane tylko przez klienta użytkownika. Próbowałem zmienić aktywną kartę, co próbowałem zrobić po stronie serwera. Zamiast tego zrobiłem to po stronie klienta.
Ricky Supit

Odpowiedzi:

134

Mieliśmy sytuację, w której musieliśmy zachować skrót adresu URL w postach zwrotnych ASP.Net. Ponieważ przeglądarka domyślnie nie wysyła skrótu na serwer, jedynym sposobem na to jest użycie JavaScript:

  1. Kiedy formularz zostanie przesłany, pobierz hash ( window.location.hash) i zapisz go w ukrytym polu wejściowym po stronie serwera. Umieść to w DIV z identyfikatorem „ urlhash”, abyśmy mogli go później łatwo znaleźć.

  2. Na serwerze możesz użyć tej wartości, jeśli chcesz coś z tym zrobić. Możesz go nawet zmienić, jeśli zajdzie taka potrzeba.

  3. Podczas ładowania strony na kliencie sprawdź wartość tego ukrytego pola. Będziesz chciał go znaleźć przez DIV, w którym jest zawarty, ponieważ automatycznie wygenerowany identyfikator nie będzie znany. Tak, możesz zrobić tutaj trochę oszustwa z .ClientID, ale okazało się, że prostsze jest po prostu użycie opakowania DIV, ponieważ pozwala on całemu JavaScriptowi żyć w zewnętrznym pliku i być używany w sposób ogólny.

  4. Jeśli ukryte pole wejściowe ma prawidłową wartość, ustaw ją jako skrót adresu URL ( window.location.hash again) i / lub wykonaj inne czynności.

Użyliśmy jQuery, aby uprościć wybór pola, itp ... w sumie kończy się to na kilku wywołaniach jQuery, jednym do zapisania wartości, a drugim do jej przywrócenia.

Przed przesłaniem:

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

Po załadowaniu strony:

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

IsHashValid()może sprawdzić „ undefined” lub inne rzeczy, którymi nie chcesz się zajmować.

Oczywiście upewnij się, że używasz $(document).ready()odpowiednio.

Chris
źródło
4
Świetne rozwiązanie, ale o co chodzi z żądaniem GET?
Warlock
2
@Chris - Ale jak wywoływane jest zdarzenie przesłania formularza, gdy po prostu wkleisz adres URL w innej przeglądarce (ponieważ jest to tylko żądanie GET)?
KrishPrabakar
@Warlock, niezależnie od get / post, będzie działać, ponieważ przechowujesz hash w ukrytym polu.
KMX,
83

RFC 2396 sekcja 4.1:

Gdy odniesienie URI jest używane do wykonywania operacji pobierania na zidentyfikowanym zasobie, opcjonalny identyfikator fragmentu, oddzielony od URI znakiem krzyżyka („#”), składa się z dodatkowych informacji odniesienia, które mają być zinterpretowane przez klienta użytkownika po pobraniu akcja została pomyślnie zakończona . W związku z tym nie jest częścią identyfikatora URI, ale często jest używany w połączeniu z identyfikatorem URI.

(podkreślenie dodane)

Mauricio Scheffer
źródło
3
Jestem zaskoczony. Dużo czytałem o SPA i nie wiedziałem o tym. Czyli przeglądarka wysyła tak wiele poufnych informacji, ale nie hash? Myślę, że powinno to w przyszłości… przynajmniej jako osobny nagłówek HTTP. To jest powiązane: onebigfluke.com/2015/01/…
bodrin
42

To dlatego, że przeglądarka nie przesyła tej części na serwer, przepraszam.

Julien Oster
źródło
7

Prawdopodobnie jedynym wyjściem jest odczytanie go po stronie klienta i ręczne przeniesienie na serwer (GET / POST / AJAX). Pozdrawiam Artur

Możesz również zobaczyć, jak grać za pomocą przycisku Wstecz i historii przeglądarki w Malcan


źródło
3

Aby wykluczyć możliwość, że w rzeczywistości nie próbujesz zobaczyć fragmentu w GET / POST i naprawdę chcesz wiedzieć, jak uzyskać dostęp do tej części obiektu URI, którą masz w kodzie po stronie serwera, znajduje się ona w Uri. ( Dokumentacja MSDN ).

patridge
źródło
8
IE8, Chrome i Firefox nie wyślą skrótu na serwer; więc Uri.Fragment jest zawsze pustym ciągiem, jeśli sprawdzisz Request.Url.Fragment po stronie serwera (zgodnie z odpowiedziami powyżej).
zcrar70
0

Możliwe rozwiązanie dla żądań GET:

Nowy format linku: http://example.com/yourDirectory?hash=video01

Wywołaj tę funkcję w kierunku górnej części kontrolera lub 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
źródło