Получение HTTP-реферера в ASP.NET


103

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



Ответы:


166

Вы можете использовать свойство UrlReferrer текущего запроса:

Request.UrlReferrer

Это будет читать HTTP-заголовок Referer из запроса, который может быть предоставлен или не предоставлен клиентом (пользовательским агентом).


8
Следует отметить, что это свойство вызовет исключение System.UriFormatException, если HTTP-заголовок реферера имеет неправильный формат.
NightOwl888

1
@Darin Dimitrov Я пытаюсь создать REST API с помощью WEB API. UrlReferrer не является частью объекта Request. Должен ли я добавить "использование" и т. Д. Что мне не хватает? DLL?
Ravi

1
Следует отметить, что разница в написании верна. Заголовок http написан с ошибкой. MS использует правильное написание в названии свойства. К сожалению, они не совпадают, что может вызвать замешательство некоторых (меня) людей при тестировании.
Джон

8
Будьте осторожны, если вы используете Request.UrlReferrerпосле обратной передачи на стороне сервера. Конечно Request.UrlReferrer, теперь будет иметь значение страницы, на которую вы отправляете сообщение. В большинстве случаев людям нужна предыдущая страница. В этом случае убедитесь, что вы сохраняете предыдущую страницу, скажем, в переменной viewstate при первой загрузке страницы. И затем, когда вы обращаетесь к этой переменной, у нее появляется предыдущая страница, с которой вы пришли. Например, в событии загрузки страницы форм 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")
Диадистис

13
Я могу вам сказать, что ServerVariables["HTTP_REFERER"]возвращает строку , а Request.UrlReferrerвозвращает Uri .
Чак Ле Батт

19
Request.Headers["Referer"]

Объяснение

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

Что касается использования Request.ServerVariables , согласно MSDN:

Коллекция Request.ServerVariables

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

Request.Headers Свойство

Получает коллекцию заголовков 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 actual = "" + 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

Относительно другого ответа я добавил условие для получения null.

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.