2008-10-28 40 views
7

我正在使用Response.Redirect将用户重定向到另一台服务器以下载文件,而另一台服务器正在检查标题以确保它来自正确的服务器...但是,似乎Response.Redirect会从响应。Response.Redirect标题标题推荐人 - 可以添加它?

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

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

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

任何建议如何我可以得到这个工作,除了显示一个按钮供用户点击(我想尽可能让用户隐藏网址)。

回答

1

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

您可能能够将推荐人保存在会话中,或将其作为查询参数在URL中进行编码。像使用ReturnUrl的Forms登录一样。

1

Server.Transfer的一个选项吗?

虽然有一些需要注意的地方, E.G.保留原始URL,授权等...更多详情请点击链接。

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

+1

Server.Transfer只是一个选项,当它在同一台服务器上时,是正确的吗?在这种情况下,我需要重定向到一个不同的服务器,所以可能不会工作:( – Jeeby 2008-10-28 12:41:39

+0

正确 - 相同的服务器... – 2008-10-28 12:43:29

+0

啊,好吧,不是然后 – Jeeby 2008-10-28 12:49:31

2

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

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

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

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

3

这将违背Referer的(原文如此)头definition

引荐[原文]请求头域 允许客户指定,为 服务器的利益,在地址(URI)的 从中 Request-URI中得到的资源( “引荐”,虽然头字段 拼写错误。)

如果你重定向,显然不是这种情况添加这个头。

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

0

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

+0

如果用户同时做两个请求?知道,这是几乎不可能发生,但谁知道... – 2008-10-28 14:31:41

+0

这是一个很好的问题,我怀疑第二个请求会覆盖我创建的Session [“referrer”]值,但是我的代码已经存储了在数据库表中的第一个请求,所以我仍然有它的报告的目的,但在这种情况下矫枉过正 – Lazarus 2008-11-06 14:54:07

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可能会指出,这是引用站点[原文]规范的松散的解释。它会做你想要的。

-2

+1以上墨迹的评论。

虽然如果你不关心规范并且只是想完成它,你可以避免使用Response.Redirect,而是自己构建响应头。

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

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

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() 
0

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

1

我知道这是旧的,但我刚刚碰到它,而试图做类似的事情。

我不想将它添加到URL中,因为它有点污染了我不想在那里的东西的URL。另外,我不希望人们意外收藏该网址。因此,我使用Cookies来添加我的数据;

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

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

-1

您需要发出307状态响应,并将位置标题设置为您希望用户重定向到的目的地。这将保持原始参考文献[原文如此]不变。

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