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

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

【问题讨论】:

标签: c# asp.net http http-headers http-referer


【解决方案1】:

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

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

【讨论】:

    【解决方案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】:

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

    string ComingUrl = "";
    if (Request.UrlReferrer != null)
    {
        ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
    }
    else
    {
        ComingUrl = "Direct"; // Your code
    }
    

    【讨论】:

      【解决方案4】:

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

      HttpContext.Request.Headers["Referer"];
      

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          使用Request.UrlReferrer 属性。

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

          【讨论】:

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

          【讨论】:

          • 这是给 ApiController 的。不过这正是我所需要的。
          【解决方案8】:

          由于 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();
          

          【讨论】:

            【解决方案9】:

            像这样:HttpRequest.UrlReferrer Property

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

            【讨论】:

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

            您可以使用当前请求的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");
            猜你喜欢
            • 2011-07-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-01
            • 1970-01-01
            相关资源
            最近更新 更多