HttpContext.Current.Request.ServerVariables [“HTTP_REFERER”] null

时间:2012-08-09 07:14:43

标签: c# asp.net

我正在尝试使用以下代码在global.asax session_start中引用url:

HttpContext.Current.Request.ServerVariables["HTTP_REFERER"]

我尝试使用Request.UrlReferrer.AbsoluteUri but UrlReferrer也是空的。

但我得到了空。你能告诉我什么是错的或替代的吗?

2 个答案:

答案 0 :(得分:6)

并非所有用户代理发送引荐来源,某些代理/中介剥离引荐来源,并且通常只有 没有引荐来源。< / p>

只需检查Request.UrlReferrer == null是否在某个时刻;如果是,请不要试着查看Request.UrlReferrer.AbsoluteUri

这里没有“错误”,你无能为力。如果你不知道他们来自哪里,你就必须忍受它。

答案 1 :(得分:2)

我知道这个答案迟了大约2年半,但我无法在UrlReferrer属性上找到详细的说明,所以我想我会在这里添加这些信息。 @ MarcGravell的回答在大多数情况下是正确的,但它错过了另一种可能性。 HTTP标头中指定的referrer值也可以是无效的uri。

因此,在UrlReferrer上使用HttpRequest属性时应该小心。如果查看使用ILSpy之类的函数调用UrlReferrer时执行的代码,您将看到它尝试解析请求标头中的值。如果该标头中的值不是有效的uri,您将获得System.UriFormatException

这意味着,在尝试访问UrlReferrer之前简单地检查AbsoluteUri是否为null,如果引荐来源不是有效的uri,则可能会留下未处理的异常。如果您需要有效的Urinull,则必须使用Request.ServerVariables["HTTP_REFERER"]然后使用Uri.TryParse,否则您必须将Request.UriReferrer == null包裹起来try-catch {1}}签入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

将此页面设置为在> $client = new-object System.Net.WebClient > $client.Headers.Add("Referer", "http://www%2etest%2e.com/test.html") > $client.DownloadString("http://localhost/urlreferrertest.aspx") 下运行,然后尝试使用无效的Uri从Powershell中调用它来获取引荐来源:

Request.UrlReferrer

如果您单步执行代码,则会发现对http://www%2etest%2e.com/test.html的调用会引发异常,并且会通过访问ServerVariable返回{{1}}。