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

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

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

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

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

任何建议如何让我的工作,除了显示一个按钮供用户点击(我想尽可能地保持用户隐藏url)。

有一个HTML黑客可用。

 

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

 Response.Write( @"
");

正如Inkel可能指出的那样,这是对Referer [原文]规范的宽松解释。 它会做你想要的。

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

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

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

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

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

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

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

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

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

Server.Transfer是一个选项吗?

虽然你需要调查一些警告。 EG保留原始URL,授权等…链接中的更多详细信息。

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

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

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

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

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

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

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

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

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

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

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

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

+1上面的墨水评论。

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

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

这不是我的头脑,你可能需要在响应头中有一些其他的东西。