在 ASP.NET 中获取 HTTP 引荐来源网址

Posted

技术标签:

【中文标题】在 ASP.NET 中获取 HTTP 引荐来源网址【英文标题】:Getting the HTTP Referrer in ASP.NET 【发布时间】:2011-05-14 13:55:15 【问题描述】:

我正在寻找一种在 ASP.Net (C#) 中获取浏览器的 HTTP Referrer 的快速、简单且可靠的方法。我知道 HTTP 引荐来源网址本身是不可靠的,但我确实想要一种可靠的方式来获取引荐来源网址,如果它存在

【问题讨论】:

How do I get the referrer URL in an ASP.NET MVC action? 的可能重复项 来自 Asp.Net Core 参见How can I get Url Referrer in ASP.NET Core MVC? 【参考方案1】:

您可以使用当前请求的UrlReferrer 属性:

Request.UrlReferrer

这将从客户端(用户代理)可能提供或不提供的请求中读取Referer HTTP 标头。

【讨论】:

需要注意的是,如果referer HTTP header格式错误,这个属性会抛出System.UriFormatException。 @Darin Dimitrov 我正在尝试使用 WEB API 创建一个 REST API。 UrlReferrer 不是 Request 对象的一部分。我应该添加一些“使用”等。我错过了什么?一个DLL? 需要注意的是,区别在于拼写是否正确。 http 标头拼写错误。 MS 在属性名称中使用正确的拼写。不幸的是,两者不匹配,这可能会导致一些人(我)在测试时感到困惑。 在服务器端回发后使用Request.UrlReferrer 时要小心。当然Request.UrlReferrer 现在将具有您要发回的页面的值。在大多数情况下,人们需要上一页。在这种情况下,请确保在页面首次加载时将上一页存储在 viewstate 变量中。然后当您访问此变量时,它具有您来自的上一页。例如,在 asp.net 表单页面加载事件中你可以这样做:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString(); ...例如,当您回帖时,您可以这样做:Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");【参考方案2】:
Request.Headers["Referer"]

说明

Request.UrlReferer 属性将抛出 System.UriFormatException 如果引用的 HTTP 标头格式错误(这可能会发生,因为它通常不受您的控制)。

因此,Request.UrlReferer 属性并非 100% 可靠 - 它可能包含无法解析为 Uri 类的数据。为确保该值始终可读,请改用Request.Headers["Referrer"]

至于使用Request.ServerVariables,正如其他人建议的那样,根据 MSDN:

Request.ServerVariables 集合

ServerVariables 集合检索预定环境变量的值和请求头信息。

Request.Headers 属性

获取 HTTP 标头的集合。

Request.Headers 是比Request.ServerVariables 更好的选择,因为Request.ServerVariables 包含所有环境变量以及标头,其中Request.Headers 是一个短得多的列表,仅包含标头。

所以最可靠的解决方案是使用Request.Headers集合直接读取值。不过,如果您要在表单上显示该值,请注意 Microsoft 关于 html 编码该值的警告。

【讨论】:

请注意,Referer 标头与HTTP_REFERRER 服务器变量的拼写不同。【参考方案3】:

使用Request.UrlReferrer 属性。

在幕后它只是检查ServerVariables("HTTP_REFERER") 属性。

【讨论】:

所以如果我使用不会有什么不同:HttpContext.Current.Request.ServerVariables["HTTP_REFERER"] ? 理论上没有区别,在实践中我不能肯定地说,因为快速查看反射器表明UrlReferrer不仅仅是简单地调用ServerVariables("HTTP_REFERER") 我可以告诉你ServerVariables["HTTP_REFERER"] 返回一个字符串,而Request.UrlReferrer 返回一个Uri【参考方案4】:

像这样:HttpRequest.UrlReferrer Property

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

【讨论】:

为了防止null,你可以说:string actual = "" + Request.UrlReferrer ?? “(默认)”; //(默认)可以是空字符串【参考方案5】:

我正在使用 .Net Core 2 mvc, 这对我有用(获取预览页面):

HttpContext.Request.Headers["Referer"];

【讨论】:

【参考方案6】:

由于 Google 会在搜索 C# Web API Referrer 时将您带到此帖子,因此这里的优惠是:Web API 使用与普通 MVC Request 不同类型的 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();

【讨论】:

【参考方案7】:
string referrer = HttpContext.Current.Request.UrlReferrer.ToString();

【讨论】:

这是给 ApiController 的。不过这正是我所需要的。【参考方案8】:

有时你必须像这样提供所有链接

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

(在“当前”未创建时的选项中)

【讨论】:

【参考方案9】:

属于其他回复,我添加了获取null的条件子句。

string ComingUrl = "";
if (Request.UrlReferrer != null)

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

else

    ComingUrl = "Direct"; // Your code

【讨论】:

【参考方案10】:

使用 .NET Core 或 .NET 5 我会推荐这个:

httpContext.Request.Headers.TryGetValue("Referer", out var refererHeader)

【讨论】:

以上是关于在 ASP.NET 中获取 HTTP 引荐来源网址的主要内容,如果未能解决你的问题,请参考以下文章

PHP:如何获取引荐来源网址?

如何在 playframework 中获取引荐来源网址

使用.htaccess从404页面获取引荐来源网址

无法使用延迟深层链接从 Facebook 实时广告中获取安装引荐来源网址值

在 JavaScript 中隐藏/欺骗引荐来源网址的最可靠方法是啥?

PHP HTTP 引荐来源网址