Отримання HTTP-реферала в ASP.NET


103

Я шукаю швидкий, простий і надійний спосіб отримати HTTP-реферал браузера в ASP.Net ( C # ). Я знаю , що HTTP Referrer сам ненадійна, але я хочу , надійний спосіб отримання реферер , якщо вона є присутня.



Відповіді:


166

Ви можете використовувати властивість UrlReferrer поточного запиту:

Request.UrlReferrer

Це зчитує заголовок HTTP Referer з запиту, який може бути, а може і не надати клієнт (агент користувача).


8
Слід зазначити, що це властивість буде кидати System.UriFormatException, якщо заголовок HTTP-рефератора неправильно сформований.
NightOwl888

1
@Darin Dimitrov Я намагаюся створити API REST за допомогою WEB API. UrlReferrer не є об'єктом Запит. Чи варто додати трохи "використання" тощо. Що я пропускаю? DLL?
Раві

1
Слід зазначити, що написання Різниця в написанні є правильним. Заголовок http написано неправильно. MS використовує правильне написання у назві властивості. На жаль, обидва не збігаються, що може викликати у деяких людей (мене) плутанину при тестуванні.
Іван

8
Будьте обережні, якщо ви використовуєте Request.UrlReferrerпісля зворотного зв'язку з сервером. Звичайно Request.UrlReferrer, тепер буде значення сторінки, на яку ви надсилаєте повідомлення. У більшості випадків людям потрібна попередня сторінка. У цьому випадку переконайтесь, що ви зберігаєте попередню сторінку у змінній перегляду, коли сторінка завантажується. І тоді, коли ви отримуєте доступ до цієї змінної, вона має попередню сторінку, з якої ви прийшли. Наприклад, у події завантаження сторінки asp.net ви можете зробити:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
JonH

4
... і коли ви, наприклад, опублікуєте повідомлення, ви можете зробити:Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
JonH

20

Використовуйте Request.UrlReferrerмайно.

Під сценами він просто перевіряє ServerVariables("HTTP_REFERER")майно.


2
Тож не було б нічого різного, якби я використовував: HttpContext.Current.Request.ServerVariables ["HTTP_REFERER"]?
Чак Ле Бут

2
Теоретично різниці немає, на практиці я не можу сказати точно, оскільки швидкий погляд з рефлектором показує, що UrlReferrerце набагато більше, ніж простий дзвінокServerVariables("HTTP_REFERER")
Diadistis

13
Я можу вам сказати, що ServerVariables["HTTP_REFERER"]повертає рядок , тоді як Request.UrlReferrerповертає Uri .
Чак Ле Бут

19
Request.Headers["Referer"]

Пояснення

Request.UrlRefererВластивість буде кидати , System.UriFormatExceptionякщо реферер HTTP заголовок неправильний формат (що може статися , так як це зазвичай не під вашим контролем).

Що стосується використання Request.ServerVariables, на MSDN:

Запит. Колекція серверних змінних

Колекція ServerVariables витягує значення заздалегідь визначених змінних середовищ і запитує інформацію заголовка.

Запит. Голосування власника

Отримує колекцію заголовків HTTP.

Request.Headersє кращим вибором, ніж Request.ServerVariables, оскільки Request.ServerVariablesмістить усі змінні середовища, а також заголовки, де Request.Headersнабагато коротший список, який містить лише заголовки.

Тож найкращим рішенням є використання Request.Headersколекції для читання значення безпосередньо. Однак слідкуйте за попередженнями Microsoft про кодування HTML значення, якщо ви збираєтеся відображати його у формі.


2
Зауважте, що Refererзаголовок написано інакше, ніж HTTP_REFERRERзмінна сервер.
Rudey

13

Як це: Властивість HttpRequest.UrlReferrer

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

2
Для захисту від null можна сказати: string current = "" + Request.UrlReferrer ?? "(за замовчуванням)"; // (за замовчуванням) може бути порожній рядок
Sheepy

10

Я використовую .Net Core 2 mvc, ця робота для мене (щоб отримати сторінку попереднього перегляду):

HttpContext.Request.Headers["Referer"];

9

Оскільки Google шукає вас на цю посаду під час пошуку C# Web API Referrerось угоди: Web APIвикористовується інший тип Requestзвичайного, що MVC Requestназивається, HttpRequestMessageякий не включає UrlReferrer. Оскільки звичайний Web APIзапит не включає цю інформацію, якщо вона вам справді потрібна, ви повинні змусити своїх клієнтів вийти зі шляху, щоб їх включити. Хоча ви могли б зробити це частиною вашого API Object, кращим способом є використання Headers.

По-перше, ви можете розширити, HttpRequestMessageщоб надати UrlReferrer()метод:

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

Тоді ваші клієнти повинні встановити Referrer Headerсвої API Request:

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

А тепер Web API Requestвключає в себе дані реферала, до яких ви можете отримати доступ таким чином зі свого Web API:

Request.UrlReferrer();


2

Колись ви повинні надати всі такі посилання

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

(опція, коли "Поточний" не заснований)


0

Приналежуючи до іншої відповіді, я додав умовне положення для отримання нуля.

string ComingUrl = "";
if (Request.UrlReferrer != null)
{
    ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
    ComingUrl = "Direct"; // Your code
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.