2009-04-21 3 views
5

Sto cercando di trovare l'url della pagina precedente. Così come se un utente naviga dalla pagina A alla pagina B usando Server.Redirect("B.aspx"), la pagina B può visualizzare l'url che si riferisce ad esso.Trovare l'URL della pagina precedente

Ho provato con

Response.Write(Page.PreviousPage.ToString()); 

Response.Write(Request.UrlReferrer.ToString()); 

Response.Write(Context.Request.UrlReferrer.ToString()); 

Response.Write(Request.ServerVariables["HTTP_REFERER"].ToString); 

ma invano mi dà errore null exception

+0

perché stai provando a farlo? Forse ci sono altre soluzioni più facili per il tuo problema – eKek0

+2

Nel mio caso avevo bisogno di conoscere il referer quando una pagina ASPX stava caricando il contenuto statico da un CDN. La soluzione (nel mio caso, il tuo chilometraggio può variare) era di estrarre il valore da HttpRequest.Params.Get ("HTTP_REFERER"). – jerhewet

+0

Ultimo ToString mancano i paran. Anche ToString() non è richiesto per questa istanza specifica. – DeadlyChambers

risposta

4

Se è solo per questo scenario (dove si programatically reindirizzare a B.aspx), perché non mettere qualcosa su la querystring per dire da dove viene il redirect. È più probabile che funzioni su più tipi di browser e dispositivi.

Un vantaggio di questo approccio è che sarete in grado di distinguere tra un reindirizzamento a B.aspx e un collegamento diretto (tramite un collegamento in una delle vostre pagine o dall'utente che inserisce l'URL in la base dell'indirizzo) alla pagina B.aspx.

Il referrer è qualcosa che il client fornisce come parte della richiesta HTTP. Come tale, non puoi fare affidamento su di esso.

Tra l'altro, questa domanda è legato: Request.UrlReferrer null?

Aggiornamento Dato i tuoi commenti non è chiaro che è una soluzione facile diverso da "modificare tutti i file". Sospetto che la ricerca/sostituzione globale potrebbe essere la soluzione migliore.

Un altro background: se si utilizza Fiddler (o qualsiasi altro strumento di debug http), si dovrebbe essere in grado di vedere che l'intestazione Referrer non viene popolata quando si esegue un reindirizzamento. Ad esempio, questo è il risultato di un redirect (vale a dire una risposta HTTP 302 causando IE per reindirizzare a un'altra pagina):

GET /webapplication1/WebForm3.aspx HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */* 
Accept-Language: en-GB 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; MS-RTC LM 8; Zune 3.0) 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 
Host: (removed) 

Ecco la richiesta HTTP che viene generato facendo clic sul link "Domande" su StackOverflow. com:

GET /questions HTTP/1.1 
    Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */* 
    Referer: https://stackoverflow.com/questions/772780/finding-previous-page-url 
    Accept-Language: en-GB 
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; MS-RTC LM 8; Zune 3.0) 
    Accept-Encoding: gzip, deflate 
    Host: stackoverflow.com 
    Connection: Keep-Alive 

Si può vedere che il successivo, generato da un collegamento su una pagina, genera l'intestazione Referer.

+0

mi dispiace ma non ho trovato questa discussione grazie per la tua risposta, ma il pensiero è che dovrò modificare 50.000 pagine così sto cercando di trovare la logica per metterlo sulla mia pagina di errore personalizzata in modo che io possa venire a sapere quale pagina ha un url rotto – Searock

+1

In tal caso, penso che probabilmente hai bisogno di codificare in modo difensivo su quella pagina e rendersi conto che non sempre otterrete questa informazione. Scusate. –

2

È anche possibile utilizzare Server.Tansfer("B.aspx") invece di Response.Redirect("B.aspx")

Edit: Searock, se non si desidera modificare il codice esistente, Request.ServerVariables["HTTP_REFERER"].ToString() dovrebbe funzionare bene in questo caso.

2

Basta notare che HTTP_REFERER non è affidabile. Non si può fare affidamento su questo perché così tanti client non inviano per vari motivi (impostazioni paranoiche, software di sicurezza, ecc.).

Anche alcune nuove finestre aperte da JS potrebbero non avere REFERER SSL> NESSUNA pagine SSL non avrà REFERER, quindi fai attenzione a fare affidamento su qualcosa del genere.

L'idea migliore sarebbe inviare la pagina precedente in Querystring.

Se si tratta di ASPX, è possibile farlo in modo più intelligente, ad esempio aggiungendo un nuovo parametro nascosto a tutti i moduli o al collegamento di elaborazione prima di scrivere il buffer.

4

È possibile risparmiare pagina corrente nella sessione e quindi recuperare da lì:

string previousPage = Session["PreviousPage"] as string; 
Session["PreviousPage"] = System.IO.Path.GetFileName(System.Web.HttpContext.Current.Request.FilePath); 

In questo modo la stringa previousPage conterrà sempre il nome del file della pagina precedente, e la variabile di sessione conterrà la pagina corrente, pronto per essere utilizzato nella pagina successiva.

In questo modo è anche possibile rilevare se il referrer è un collegamento esterno perché la stringa previousPage sarà null.

+2

Sarà un problema se l'utente usa due finestre in modo che la sessione venga sovrascritta. Se questo non è un problema, questa è una buona soluzione. –

1

Potresti semplicemente confermare quali metodi stai effettivamente utilizzando qui (idealmente modificando la domanda originale)?

HttpServerUtility (ad esempio, Server.) non ha un metodo "Reindirizzamento", ha Trasferimento ed Esegui.

HttpResponse (ad esempio Risposta).

HttpResponse.Redirect invierà una risposta 302 al client, indicando di emettere una nuova richiesta per il valore del campo Posizione. Sono quindi in grado di interrogare Request.UrlReferrer per vedere il valore della pagina che ha eseguito il reindirizzamento.

Se si utilizza HttpServerUtility.Transfer o HttpServerUtility.Execute, queste azioni si verificano interamente sul server all'interno di ASP.NET, pertanto il "referrer" potrebbe essere nullo. Il browser client penserà anche che sia ancora sulla pagina originariamente richiesta.

Vedere anche How to detect if an aspx page was called from Server.Execute

Problemi correlati