【问题标题】:Response.Redirect strips Header Referrer - Possible to Add it Back?Response.Redirect 剥离 Header Referrer - 可以将其添加回来吗?
【发布时间】:2010-09-19 13:46:39
【问题描述】:

我正在使用 Response.Redirect 将用户重定向到另一台服务器以下载文件,而另一台服务器正在检查标头以确保它来自正确的服务器...但是似乎 Response.Redirect 剥离了标头来自响应。

有人知道我如何将标题添加回来吗?我试过了:

Response.AddHeader("Referer", "www.domain.com");

但是当我检查是否设置了 Referrer 标头时,接收页面测试为 false。

除了显示一个供用户点击的按钮之外,我有什么建议可以让这个工作正常进行(我希望尽可能地对用户隐藏 url)。

【问题讨论】:

    标签: c# asp.net .net http-headers response.redirect


    【解决方案1】:

    有一个 HTML hack 可用。

    <form action="http://url.goes.here" id="test" method="GET"></form>
    <script type="text/javascript">
      document.getElementById("test").submit();
    </script>
    

    如果您需要从后面的代码中触发,也可以这样做:

    Response.Write( @"<form action='http://url.goes.here' id='test' method='GET'></form>
                      <script type='text/javascript'>
                         document.getElementById('test').submit();
                      </script> ");
    

    正如 Inkel 可能指出的,这是对 Referer[sic] 规范的松散解释。它会做你想做的事。

    【讨论】:

    • 是的,这是在 IE7 和 FF3 中唯一对我有用的东西
    • 你需要在你的c#中转义"
    【解决方案2】:

    您需要发出 307 状态响应并将位置标头设置为您希望将用户重定向到的目标。这将保持原始的referer[sic] 标头完好无损。

    HttpContext.Current.Response.StatusCode = 307;
    HttpContext.Current.Response.AddHeader("Location", "http://stackoverflow.com");
    HttpContext.Current.Response.End(); 
    

    【讨论】:

    • 这与问题对应的方式不起作用。重定向的请求没有预期的引用字符串(虽然你说过)。
    【解决方案3】:

    这是一个适合我的旧版本:

    default.asp
    
    servername = Lcase(Request.ServerVariables("SERVER_NAME"))
    Response.Status = "301 Moved Permanently"
    Response.AddHeader "Location", "http://yoursite"
    Response.AddHeader "Referer", servername
    Response.End()
    

    【讨论】:

      【解决方案4】:

      我知道这是旧的,但我只是在尝试做类似的事情时遇到它。

      我不想将它添加到 URL,因为它有点用我不想要的东西污染了 URL。此外,我不希望人们意外地为该 URL 添加书签。因此,我使用 Cookies 来添加我的数据;

      string token = vwrApi.GetAuthenticationToken(userId);
      Response.Cookies.Add(new HttpCookie("VwrAuthorization", token));
      Response.Redirect(returnUrl, true);
      

      当然,这取决于您更改目标服务器查找信息的位置的能力,但至少这是另一种选择。

      【讨论】:

        【解决方案5】:

        我不建议发布 - 大多数网站都会阻止它。 只需使用javascript document.location = '&lt;%:yourURL%&gt;;';,它将自动加载新页面。这对我来说效果很好 - 因为重定向响应不包括推荐人。

        【讨论】:

          【解决方案6】:

          +1 对 inkel 的上述评论。

          尽管如果您不关心规范并且只想这样做,您可以避免使用 Response.Redirect 而是自己构建响应标头。

          Response.StatusCode = 302; //temp redirect
          Response.Headers.Add("Location", "your/url/here");
          Response.Headers.Add("Referer", "something.com");
          Response.End();
          

          这不是我的想法,您可能需要在响应标头中添加一些其他内容。

          【讨论】:

            【解决方案7】:

            如果重定向到同一个进程,我会使用 Session 值来存储引用 URI 以允许辅助页面获取它。我在我的系统上使用它来维护将 http 连接重定向到我们的 https 系统之间的引用。

            【讨论】:

            • 如果用户同时发出两个请求怎么办?我知道,这几乎是不可能发生的,但谁知道......
            • 这是个好问题。我怀疑第二个请求会覆盖我创建的 Session["referrer"] 值,但是我的代码已经将第一个请求存储在数据库表中,所以我仍然将它用于报告目的,但在这种情况下过度杀伤。
            【解决方案8】:

            这将违背Referer(原文如此)标题definition

            Referer[sic] 请求头字段 允许客户指定,对于 服务器的好处,地址(URI) 来自的资源 已获取请求 URI( “referrer”,虽然标题字段 拼写错误。)

            如果您要重定向,显然不能添加此标头。

            如果您需要此信息,请尝试使用 cookie 或某些会话变量,或者更好的是 URL 中的变量,正如您已经被告知的那样。

            【讨论】:

              【解决方案9】:

              设置身份验证 cookie(带有键控哈希和 5 分钟到期),发送重定向响应,浏览器将新请求与身份验证 cookie 一起发送到第二台服务器(如果它是同一个域),第二台服务器检查cookie,确保只有第一个服务器可以设置它,并将内容发送回浏览器。

              【讨论】:

                【解决方案10】:

                您的第二台服务器获取的referrer Header 是由浏览器生成的,您不太可能以任何合理的方式更改它。

                您是否尝试将引用者添加到 URL,然后改为在您的第二台服务器上读取?

                Response.Redirect("url?Referer=" + Server.UrlEncode(Request.UrlReferrer));
                

                【讨论】:

                • 您需要围绕该参数添加额外的安全处理,因为客户端可以随意篡改它
                • 嗯,这取决于正在做什么。从原始问题中很难知道这是否是一个问题。关于什么是安全的以及为什么安全几乎没有什么可说的。或者,如果它根本是安全检查。
                【解决方案11】:

                Server.Transfer 是一个选项吗?

                但您需要了解一些注意事项。 例如。保留原始 URL、授权等...更多详细信息在链接中。

                在这种情况下,保留原始 URL 可能是有利的。

                【讨论】:

                • Server.Transfer 只是在同一服务器上时的一个选项,对吗?在这种情况下,我需要重定向到不同的服务器,所以可能无法正常工作:(
                【解决方案12】:

                我认为这是不可能的。您发送回客户端的是一个 Location 标头,它告诉客户端加载引用的页面而不是它最初请求的页面。在这种情况下,客户端不是来自链接,因此不会设置引用标头。基本上就好像用户在浏览器的地址栏中输入了重定向 url。

                您可以将引荐来源网址保存在会话中,或在 URL 中将其编码为查询参数。就像 Forms 登录对 ReturnUrl 所做的那样。

                【讨论】:

                  猜你喜欢
                  • 2013-04-05
                  • 2013-04-04
                  • 1970-01-01
                  • 2019-01-09
                  • 1970-01-01
                  • 2013-05-05
                  • 2011-06-10
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多