2008-10-28 39 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();