Response.Redirect strip Header Referrer - 可以添加回来吗?

时间:2008-10-28 12:16:52

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

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

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

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

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

除了显示用户点击的按钮(我希望尽可能地保持用户隐藏网址)之外,我还知道如何使其正常工作。

12 个答案:

答案 0 :(得分:9)

有一个HTML黑客可用。

<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 [原文如此]规范的宽松解释。它会做你想要的。

答案 1 :(得分:3)

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

  

Referer [sic] request-header字段   允许客户端指定   服务器的好处,地址(URI)   从哪个资源   获得了Request-URI (   “引用者”,虽然是标题字段   错误拼写。)

如果您要重定向,显然不是添加此标题的情况。

如果您需要此信息,请尝试使用Cookie或某个会话变量,或者更好地使用URL中的变量,因为您已经被告知过。

答案 2 :(得分:2)

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

您是否尝试将推荐人添加到网址,然后在第二台服务器上阅读?

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

答案 3 :(得分:1)

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

您可以在会话中保存引荐来源,或将其作为查询参数在URL中进行编码。就像使用ReturnUrl的Forms登录一样。

答案 4 :(得分:1)

Server.Transfer是一个选项吗?

虽然您需要了解一些警告。 例如。保留原始URL,授权等...链接中的更多详细信息。

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

答案 5 :(得分:1)

这是以前适用于我的版本:

default.asp

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

答案 6 :(得分:1)

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

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

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我不建议发布 - 大多数网站阻止了这一点。 只需使用javascript document.location = '<%:yourURL%>;';即可自动加载新页面。这对我来说效果很好 - 因为重定向响应不包括引用者。

答案 10 :(得分:-1)

您需要发出307状态响应,并将位置标头设置为您希望用户重定向到的目标位置。这将使原始引用[sic]标题保持不变。

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

答案 11 :(得分:-2)

+1上面的墨水评论。

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

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

这不是我的首要问题,您可能需要在响应标题中包含其他一些内容。