Ottenere il referrer HTTP in ASP.NET


103

Sto cercando un modo rapido, semplice e affidabile per ottenere il referrer HTTP del browser in ASP.Net ( C # ). So che il referrer HTTP stesso è inaffidabile, ma desidero un modo affidabile per ottenere il referrer se è presente.



Risposte:


166

È possibile utilizzare la proprietà UrlReferrer della richiesta corrente:

Request.UrlReferrer

Questo leggerà l' intestazione HTTP del referer dalla richiesta che può o non può essere fornita dal client (agente utente).


8
Si noti che questa proprietà genererà un'eccezione System.UriFormatException se l'intestazione HTTP del referer non è valida.
NightOwl888

1
@Darin Dimitrov Sto cercando di creare un'API REST utilizzando l'API WEB. UrlReferrer non fa parte dell'oggetto Request. Devo aggiungere un po 'di "utilizzo" ecc. Cosa mi manca? una DLL?
Ravi

1
Va notato che la differenza è l'ortografia è corretta. L'intestazione http è scritta in modo errato. MS utilizza l'ortografia corretta nel nome della proprietà. Sfortunatamente, i due non corrispondono, il che può causare confusione ad alcune persone (me) durante il test.
Giovanni

8
Fai attenzione se stai usando Request.UrlReferrerdopo un postback lato server. Ovviamente Request.UrlReferrerora avrà il valore della pagina in cui stai postando. Nella maggior parte dei casi, le persone hanno bisogno della pagina precedente. In questo caso, assicurati di memorizzare la pagina precedente in una variabile di viewstate quando la pagina viene caricata per la prima volta. E poi quando accedi a questa variabile ha la pagina precedente da cui sei venuto. Ad esempio, nell'evento di caricamento della pagina dei moduli asp.net puoi eseguire:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
JonH

4
... e quando Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
pubblichi di

20

Utilizzare il Request.UrlReferrer proprietà.

Sotto le scene sta solo controllando la ServerVariables("HTTP_REFERER")proprietà.


2
Quindi non ci sarebbe alcuna differenza se usassi: HttpContext.Current.Request.ServerVariables ["HTTP_REFERER"]?
Chuck Le Butt

2
In teoria non c'è differenza, in pratica non posso dirlo con certezza dato che una rapida occhiata con il riflettore mostra che UrlReferrerfa molto di più di una semplice chiamata aServerVariables("HTTP_REFERER")
Diadistis

13
Posso dirti che ServerVariables["HTTP_REFERER"]restituisce una stringa , mentre Request.UrlReferrerrestituisce un Uri .
Chuck Le Butt

19
Request.Headers["Referer"]

Spiegazione

La Request.UrlRefererproprietà lancerà un fileSystem.UriFormatException se l'intestazione HTTP del referer non è formattata correttamente (cosa che può accadere poiché di solito non è sotto il tuo controllo).

Per quanto riguarda l'utilizzo Request.ServerVariables , per MSDN:

Raccolta Request.ServerVariables

La raccolta ServerVariables recupera i valori delle variabili di ambiente predeterminate e le informazioni di intestazione della richiesta.

Proprietà Request.Headers

Ottiene una raccolta di intestazioni HTTP.

Request.Headersè una scelta migliore rispetto a Request.ServerVariables, poiché Request.ServerVariablescontiene tutte le variabili di ambiente nonché le intestazioni, doveRequest.Headers c'è un elenco molto più breve che contiene solo le intestazioni.

Quindi la soluzione migliore è utilizzare la Request.Headersraccolta per leggere direttamente il valore. Tuttavia, fai attenzione agli avvertimenti di Microsoft sulla codifica HTML del valore se intendi visualizzarlo in un modulo.


2
Notare che l' Refererintestazione è scritta in modo diverso dalla HTTP_REFERRERvariabile del server.
Rudey

13

In questo modo: proprietà HttpRequest.UrlReferrer

Uri myReferrer = Request.UrlReferrer;
string actual = myReferrer.ToString();

2
Per proteggersi da null, puoi dire: string actual = "" + Request.UrlReferrer ?? "(predefinito)"; // (impostazione predefinita) può essere una stringa vuota
Sheepy

10

Sto usando .Net Core 2 mvc, questo funziona per me (per ottenere la pagina delle anteprime):

HttpContext.Request.Headers["Referer"];

9

Dato che Google ti porta a questo post durante la ricerca, C# Web API Referrerecco l'affare: Web APIutilizza un tipo diverso Requestdal normale MVC Requestchiamato HttpRequestMessageche non include UrlReferrer. Poiché una Web APIrichiesta normale non include queste informazioni, se ne hai davvero bisogno, devi chiedere ai tuoi clienti di fare di tutto per includerle. Sebbene tu possa fare in modo che questo diventi parte del tuo API Object, un modo migliore è usareHeaders .

Innanzitutto, puoi estendere HttpRequestMessageper fornire un UrlReferrer()metodo:

public static string UrlReferrer(this HttpRequestMessage request)
{
    return request.Headers.Referrer == null ? "unknown" : request.Headers.Referrer.AbsoluteUri;
}

Quindi i tuoi clienti devono impostare il Referrer Headerloro API Request:

// Microsoft.AspNet.WebApi.Client
client.DefaultRequestHeaders.Referrer = new Uri(url);

E ora Web API Requestinclude i dati del referrer a cui puoi accedere in questo modo dal tuo Web API:

Request.UrlReferrer();

2
string referrer = HttpContext.Current.Request.UrlReferrer.ToString();

1
Questo è per ApiController. Questo è ciò di cui avevo bisogno però.
Csaba Toth

2

A volte devi dare tutti i link in questo modo

System.Web.HttpContext.Current.Request.UrlReferrer.ToString();

(in opzione quando "Corrente" non è stata fondata)


0

Appartenente ad altra risposta, ho aggiunto clausola di condizione per l'annullamento.

string ComingUrl = "";
if (Request.UrlReferrer != null)
{
    ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
    ComingUrl = "Direct"; // Your code
}
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.