Получение 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, если вы собираетесь отображать его в форме.

НочьСова888
источник
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
string referrer = HttpContext.Current.Request.UrlReferrer.ToString();
Донат Сасин
источник
1
Это для ApiController. Но это то, что мне было нужно.
Чаба Тот,
2

Когда-нибудь вы должны дать всю ссылку вот так

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

(в варианте, когда «Текущий» не основан)

Sportac
источник
0

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

string ComingUrl = "";
if (Request.UrlReferrer != null)
{
    ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
    ComingUrl = "Direct"; // Your code
}
mrbengi
источник