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();
这不是我的头脑,你可能需要在响应头中有一些其他的东西。