我正在尝试使用以下代码在 global.asax session_start 中获取引用 url:
HttpContext.Current.Request.ServerVariables["HTTP_REFERER"]
我尝试使用Request.UrlReferrer.AbsoluteUri but UrlReferrer
也是空的。
但我越来越空了。你能告诉我什么是错的或替代的吗?
并非所有的用户代理都会发送推荐人,一些代理/中介会剥离推荐人,而且通常根本没有推荐人。
只需检查是否Request.UrlReferrer == null
在某个时候;如果是,请不要尝试查看Request.UrlReferrer.AbsoluteUri
.
这里没有什么“错误”,你也无能为力。如果您不知道它们来自哪里,那么您将不得不忍受它。
我知道这个答案大约晚了 2 1/2 年,但我找不到关于该UrlReferrer
物业的详尽文章,所以我想我会在此处添加此信息。@MarcGravell 的回答在很大程度上是正确的,但它错过了另一种可能性。HTTP 标头中指定的引用者值也可能是无效的 uri。
因此,在使用 上的UrlReferrer
属性时应该小心HttpRequest
。如果您查看UrlReferrer
使用 ILSpy 之类的调用时执行的代码,您会看到它尝试解析请求标头中的值。如果该标头中的值不是有效的 uri,您将获得一个System.UriFormatException
.
这意味着如果引用者不是有效的 uri,则UrlReferrer
在尝试访问之前简单地检查 null可能会给您留下未处理的异常。AbsoluteUri
如果您想要一个有效的Uri
or null
,则必须使用Request.ServerVariables["HTTP_REFERER"]
and then Uri.TryParse
,否则您必须将Request.UriReferrer == null
支票包装在try-catch
.
我整理了一个快速演示来展示该UrlReferrer
属性的行为。以以下页面为例:
<%@ Page Language="C#" AutoEventWireup="true" %>
<html><body>
<table border="1">
<tr><td>Referrer</td><td><%= GetUrlReferrer() %></td></tr>
</table>
</body></html>
<script runat="server">
public string GetUrlReferrer()
{
try
{
return Request.UrlReferrer == null ? "(None)" : Request.UrlReferrer.ToString();
}
catch (Exception ex)
{
return Request.ServerVariables["HTTP_REFERER"] + " (from Server Variable)";
}
}
</script>
将此页面设置为在 下运行http://localhost/urlreferrertest.aspx
,然后尝试从 Powershell 使用无效 Uri 调用它:
> $client = new-object System.Net.WebClient
> $client.Headers.Add("Referer", "http://www%2etest%2e.com/test.html")
> $client.DownloadString("http://localhost/urlreferrertest.aspx")
如果您单步执行代码,您将看到对 的调用Request.UrlReferrer
引发异常,并且http://www%2etest%2e.com/test.html
通过访问ServerVariable
.