Come ottenere Url Hash (#) dal lato server


133

So che sul lato client (javascript) è possibile utilizzare windows.location.hash ma non è stato possibile trovare comunque l'accesso dal lato server.


hai trovato un modo per risolvere questo problema, ho dei segnalibri con has nell'URL e voglio accedere al testo dopo l'hash sul lato server?
dotnetcoder,

Le risposte spiegano che questo non è disponibile sul server, perché viene interpretato solo dall'agente utente. Stavo cercando di cambiare la scheda attiva, cosa che stavo cercando di fare sul lato server. Ho finito per farlo invece sul lato client.
Ricky Supit,

Risposte:


134

Abbiamo avuto una situazione in cui dovevamo persistere l'hash dell'URL attraverso i back-back di ASP.Net. Poiché il browser non invia l'hash al server per impostazione predefinita, l'unico modo per farlo è utilizzare un po 'di Javascript:

  1. Quando il modulo si inoltra, prendi l'hash ( window.location.hash) e memorizzalo in un campo di input nascosto sul lato server Metti questo in un DIV con un ID " urlhash" in modo da poterlo trovare facilmente in seguito.

  2. Sul server è possibile utilizzare questo valore se è necessario fare qualcosa con esso. Puoi anche cambiarlo se necessario.

  3. Al caricamento della pagina sul client , controlla il valore di questo campo nascosto. Lo vorrai trovare dal DIV in cui è contenuto poiché l'ID generato automaticamente non sarà noto. Sì, potresti fare qualche trucco con .ClientID ma abbiamo trovato più semplice usare il DIV wrapper in quanto consente a tutto questo Javascript di vivere in un file esterno e di essere usato in modo generico.

  4. Se il campo di input nascosto ha un valore valido, impostalo come hash URL ( window.location.hash again) e / o esegui altre azioni.

Abbiamo usato jQuery per semplificare la selezione del campo, ecc ... tutto sommato si tratta di alcune chiamate jQuery, una per salvare il valore e un'altra per ripristinarlo.

Prima di inviare:

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

Caricamento a pagina:

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

IsHashValid()può controllare " undefined" o altre cose che non vuoi gestire.

Inoltre, assicurati di usarlo in modo $(document).ready()appropriato, ovviamente.


4
Ottima soluzione, ma per quanto riguarda la richiesta GET?
Stregone

2
@Chris - Ma come viene chiamato l'evento form submit quando si incolla semplicemente l'URL in un browser diverso (perché è solo una richiesta GET)?
KrishPrabakar,

@Warlock, indipendentemente da get / post funzionerà poiché stai memorizzando l'hash in un campo nascosto.
KMX

83

RFC 2396 sezione 4.1:

Quando viene utilizzato un riferimento URI per eseguire un'azione di recupero sulla risorsa identificata, l'identificatore di frammento opzionale, separato dall'URI da un carattere di tratteggio ("#"), è costituito da ulteriori informazioni di riferimento che devono essere interpretate dall'agente utente dopo il recupero l'azione è stata completata con successo . Pertanto, non fa parte di un URI, ma viene spesso utilizzato insieme a un URI.

(enfasi aggiunta)


3
Sono sorpreso. Ho letto molto su SPA e non lo sapevo. Quindi il browser invia così tante informazioni sensibili ma non l'hash ?? Penso che dovrebbe in futuro .. almeno come intestazione HTTP separata. Questo è collegato: onebigfluke.com/2015/01/…
bodrin,

42

Questo perché il browser non trasmette quella parte al server, mi dispiace.


7

Probabilmente l'unica scelta è quella di leggerlo sul lato client e trasferirlo manualmente sul server (GET / POST / AJAX). Saluti Artur

Puoi anche vedere come giocare con il pulsante Indietro e la cronologia del browser su Malcan


3

Solo per escludere la possibilità che non si stia effettivamente cercando di vedere il frammento su un GET / POST e che si desideri effettivamente sapere come accedere a quella parte di un oggetto URI che si ha all'interno del proprio codice lato server, è sotto Uri.Fragment ( Documenti MSDN ).


8
IE8, Chrome e Firefox non invieranno tutti l'hash al server; quindi, Uri.Fragment è sempre una stringa vuota se si esamina Request.Url.Fragment sul lato server (secondo le risposte sopra.)
zcrar70

0

Possibile soluzione per richieste GET:

Nuovo formato link: http://example.com/yourDirectory?hash=video01

Chiamare questa funzione verso la parte superiore del controller o 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");
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.