2009-04-21 56 views
5

我正在嘗試查找上一頁的網址。例如,如果用戶使用Server.Redirect("B.aspx")從頁面A導航到頁面B,則頁面B可以顯示引用它的網址。查找上一頁Url

我一直在使用

Response.Write(Page.PreviousPage.ToString()); 

Response.Write(Request.UrlReferrer.ToString()); 

Response.Write(Context.Request.UrlReferrer.ToString()); 

Response.Write(Request.ServerVariables["HTTP_REFERER"].ToString); 

嘗試,但一切都是徒勞它給了我null exception錯誤

+0

你爲什麼要這麼做?也許有其他解決方案更容易對您的問題 – eKek0 2009-04-21 14:19:27

+2

在我的情況下,當ASPX頁面加載來自CDN的靜態內容時,我需要知道引用者。解決方案(在我的情況下,您的里程可能會有所不同)是從HttpRequest.Params.Get(「HTTP_REFERER」)中提取值。 – jerhewet 2011-12-23 19:09:41

+0

Last ToString缺少parans。此特定實例也不需要ToString()。 – DeadlyChambers 2015-03-25 21:43:06

回答

4

如果它只是對於這種情況(你編程重定向到B.aspx),那麼爲什麼不把東西查詢字符串來說明重定向來自何處。這將更有可能適用於多種瀏覽器類型和設備。

這種方法的一個優點是,您將能夠區分重定向到B.aspx和直接鏈接(通過您的一個頁面上的鏈接或從輸入URL的用戶到地址庫)到頁面B.aspx。

referrer是客戶端作爲HTTP請求的一部分提供的內容。因此,你不能依賴它。

順便說一句,這個問題是相關的: Request.UrlReferrer null?

更新 考慮您的意見目前還不清楚這是不是「編輯的所有文件」等簡單的解決辦法。我懷疑全球搜索/替換可能是你最好的選擇。

更多背景:如果您使用Fiddler(或任何其他的http調試工具),您應該能夠看到在執行重定向時Referrer頭沒有被填充。例如,這是一個重定向的結果(即,HTTP 302響應引起IE重定向到另一個頁):

GET /webapplication1/WebForm3.aspx HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */* 
Accept-Language: en-GB 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; MS-RTC LM 8; Zune 3.0) 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 
Host: (removed) 

這裏是通過點擊在計算器上的「問題」鏈接生成的HTTP請求。 com:

GET /questions HTTP/1.1 
    Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */* 
    Referer: https://stackoverflow.com/questions/772780/finding-previous-page-url 
    Accept-Language: en-GB 
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; MS-RTC LM 8; Zune 3.0) 
    Accept-Encoding: gzip, deflate 
    Host: stackoverflow.com 
    Connection: Keep-Alive 

您可以看到由頁面上的鏈接生成的更高版本會生成Referer標頭。

2

您還可以使用的,而不是Server.Tansfer("B.aspx")Response.Redirect("B.aspx")

編輯:Searock,如果你不想改變現有的代碼,Request.ServerVariables["HTTP_REFERER"].ToString()應該在這種情況下正常工作。

2

只是要注意,HTTP_REFERER不可靠。你不能依賴它,因爲如此多的客戶不會因爲各種原因而發送(偏執設置,安全軟件等)。

另外一些由JS打開的新窗口可能沒有REFERER SSL> NONE SSL頁面也不會有REFERER,因此要小心依賴類似的東西。

更好的想法是發送上一頁Querystring。

如果是ASPX,你可以用更聰明的方式來做,比如在寫出緩衝區之前向所有表單或處理鏈接添加一個新的隱藏參數。

4

您可以保存當前頁面中的會話,然後從那裏檢索:

string previousPage = Session["PreviousPage"] as string; 
Session["PreviousPage"] = System.IO.Path.GetFileName(System.Web.HttpContext.Current.Request.FilePath); 

這樣,那麼PreviousPage串總是包含前一頁面的文件名和Session變量將包含當前頁面,準備好在下一頁使用。

這樣您也可以檢測引用鏈接是否是外部鏈接,因爲那麼previousPage字符串將爲空。

1

您能否確認您在這裏實際使用的方法(理想情況下是通過編輯原始問題)?

HttpServerUtility(即服務器。)沒有「重定向」方法,它有Transfer和Execute。

HttpResponse(即響應。)。

HttpResponse.Redirect將向客戶端發送一個302響應,告訴它發出一個新的位置字段值的請求。然後,我可以查詢Request.UrlReferrer以查看執行重定向的頁面的值。

如果您正在使用HttpServerUtility.TransferHttpServerUtility.Execute那麼這些動作在ASP.NET中的服務器完全發生,所以「引薦」很可能是空的。客戶端瀏覽器也會認爲它仍然在最初請求的頁面上。

另請參見How to detect if an aspx page was called from Server.Execute