在 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 引荐来源网址的主要内容,如果未能解决你的问题,请参考以下文章
无法使用延迟深层链接从 Facebook 实时广告中获取安装引荐来源网址值