7

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

有谁知道我可以如何添加标题?我试过了:

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

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

除了显示一个供用户单击的按钮之外,我如何获得此工作的任何建议(我希望尽可能地对用户隐藏 url)。

4

12 回答 12

10

有一个 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] 规范的松散解释。它会做你想做的事。

于 2008-10-29T16:41:38.600 回答
3

这将违反Referer(原文如此)标头定义

为了服务器的利益,Referer[sic] request-header 字段允许客户端指定获取Request-URI 的资源的地址 (URI)(“referrer”,尽管头字段拼写错误。)

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

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

于 2008-10-28T13:40:15.613 回答
1

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

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

于 2008-10-28T12:24:28.170 回答
1

Server.Transfer是一个选项吗?

不过,您需要注意一些注意事项。EG 保留原始 URL、授权等...更多详细信息在链接中。

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

于 2008-10-28T12:37:51.993 回答
1

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

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

Response.Redirect("url?Referer=" + Server.UrlEncode(Request.UrlReferrer));
于 2008-10-28T13:20:44.640 回答
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()
于 2010-12-16T16:00:39.943 回答
1

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

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

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

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

于 2012-04-13T07:55:10.757 回答
0

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

于 2008-10-28T13:32:15.893 回答
0

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

于 2008-10-28T14:25:20.547 回答
0

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

于 2012-03-06T13:13:32.887 回答
-1

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

HttpContext.Current.Response.StatusCode = 307;
HttpContext.Current.Response.AddHeader("Location", "http://stackoverflow.com");
HttpContext.Current.Response.End(); 
于 2012-06-27T18:09:22.523 回答
-2

+1 对 inkel 的上述评论。

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

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

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

于 2008-10-29T16:47:44.453 回答