2009-04-21 26 views
5

Tôi đang cố tìm url của trang trước. Như thể người dùng điều hướng từ Trang A đến Trang B bằng cách sử dụng Server.Redirect("B.aspx"), trang B có thể hiển thị url đề cập đến nó.Tìm trang trước Url

Tôi đã cố gắng sử dụng

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

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

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

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

nhưng tất cả là vô ích nó mang lại cho tôi null exception lỗi

+0

tại sao bạn đang cố thực hiện việc này? Có lẽ có giải pháp khác dễ dàng hơn cho vấn đề của bạn – eKek0

+2

Trong trường hợp của tôi, tôi cần biết người giới thiệu khi trang ASPX đang tải nội dung tĩnh từ CDN. Giải pháp (trong trường hợp của tôi, số dặm của bạn có thể thay đổi) là để kéo giá trị từ HttpRequest.Params.Get ("HTTP_REFERER"). – jerhewet

+0

Last ToString bị thiếu. Ngoài ra ToString() là không cần thiết cho trường hợp cụ thể này. – DeadlyChambers

Trả lời

4

Nếu nó chỉ cho kịch bản này (nơi bạn programatically chuyển hướng đến B.aspx) thì tại sao không đặt một cái gì đó trên chuỗi truy vấn để nói chuyển hướng đến từ đâu. Điều này sẽ có nhiều khả năng hoạt động trên nhiều loại trình duyệt và thiết bị khác nhau.

Một lợi thế của phương pháp này là bạn có thể biết sự khác biệt giữa chuyển hướng đến B.aspx và liên kết trực tiếp (hoặc qua liên kết trên một trong các trang của bạn hoặc từ người dùng nhập URL vào cơ sở địa chỉ) đến trang B.aspx.

Liên kết giới thiệu là thứ mà khách hàng cung cấp như một phần của yêu cầu HTTP. Như vậy, bạn không thể dựa vào nó.

Bằng cách này, câu hỏi này có liên quan: Request.UrlReferrer null?

Cập nhật Với ý kiến ​​của bạn nó không rõ ràng đó là một giải pháp dễ dàng khác hơn là "chỉnh sửa tất cả các file của bạn". Tôi nghi ngờ rằng tìm kiếm/thay thế toàn cầu có thể là đặt cược tốt nhất của bạn.

Một số nền khác: Nếu bạn sử dụng Fiddler (hoặc bất kỳ công cụ gỡ lỗi http nào khác), bạn sẽ có thể thấy tiêu đề Liên kết giới thiệu không được điền khi bạn thực hiện chuyển hướng. Ví dụ, đây là kết quả của một chuyển hướng (tức là một phản ứng HTTP 302 gây IE để chuyển hướng đến một trang khác):

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) 

Đây là yêu cầu HTTP được tạo ra bằng cách nhấn vào "Câu hỏi" liên kết trên StackOverflow. 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 

Bạn có thể thấy rằng sau này, được tạo bởi liên kết trên trang, tạo tiêu đề Người giới thiệu.

+0

Tôi xin lỗi nhưng tôi không thể tìm thấy chủ đề này cảm ơn câu trả lời của bạn nhưng suy nghĩ là tôi sẽ phải chỉnh sửa 50.000 trang vì vậy tôi đang cố gắng tìm logic để đặt nó trên trang lỗi tùy chỉnh của tôi để tôi có thể đến biết trang nào có một url bị hỏng – Searock

+1

Trong trường hợp này, tôi nghĩ bạn có thể cần phải mã hóa bảo vệ trên trang đó và nhận ra rằng bạn sẽ không luôn nhận được thông tin này. Lấy làm tiếc. –

2

Bạn cũng có thể sử dụng Server.Tansfer("B.aspx") thay vì Response.Redirect("B.aspx")

Edit: Searock, nếu bạn không muốn thay đổi mã hiện tại của bạn, Request.ServerVariables["HTTP_REFERER"].ToString() nên hoạt động tốt trong trường hợp đó.

2

Chỉ cần lưu ý rằng HTTP_REFERER không đáng tin cậy. Bạn không thể dựa vào điều đó vì rất nhiều khách hàng không gửi vì nhiều lý do khác nhau (cài đặt hoang tưởng, phần mềm bảo mật, v.v.).

Cũng có một số cửa sổ mới được mở bởi JS có thể không có REFERER SSL> KHÔNG có trang SSL nào cũng không có REFERER, vì vậy hãy cẩn thận khi dựa vào một thứ như thế.

Ý tưởng tốt hơn sẽ gửi trang trước đó trong Chuỗi truy vấn.

Nếu đó là ASPX bạn có thể làm điều đó một cách thông minh hơn như thêm thông số ẩn mới vào tất cả các biểu mẫu hoặc xử lý liên kết ngay trước khi ghi bộ đệm ra.

4

Bạn có thể giúp bạn tiết kiệm trang hiện tại trong phiên và sau đó lấy nó từ đó:

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

Bằng cách này, chuỗi previousPage sẽ luôn chứa tên tập tin trang trước, và các biến Session sẽ chứa các trang hiện tại, sẵn sàng để được sử dụng trên trang tiếp theo.

Bằng cách này bạn cũng có thể phát hiện xem liên kết giới thiệu có phải là liên kết bên ngoài hay không bởi vì sau đó chuỗi previousPage sẽ là rỗng.

+2

Sẽ là vấn đề nếu người dùng sử dụng hai cửa sổ để phiên sẽ bị ghi đè. Nếu đây không phải là vấn đề thì đây là giải pháp tốt. –

1

Bạn có thể xác nhận phương pháp nào bạn đang thực sự sử dụng ở đây (lý tưởng bằng cách chỉnh sửa câu hỏi gốc)?

HttpServerUtility (ví dụ: Máy chủ.) không có phương thức "Chuyển hướng", nó đã chuyển và thực thi.

HttpResponse (ví dụ: Trả lời.).

HttpResponse.Redirect sẽ gửi trả lời 302 cho khách hàng, yêu cầu họ gửi yêu cầu mới cho giá trị của trường Vị trí. Sau đó tôi có thể truy vấn Request.UrlReferrer để xem giá trị của trang đã thực hiện Chuyển hướng.

Nếu bạn đang sử dụng HttpServerUtility.Transfer hoặc HttpServerUtility.Execute thì những hành động này xảy ra hoàn toàn tại máy chủ trong ASP.NET và do đó "liên kết giới thiệu" cũng có thể là rỗng. Trình duyệt của khách hàng cũng sẽ nghĩ rằng nó vẫn còn trên trang được yêu cầu ban đầu.

Xem thêm How to detect if an aspx page was called from Server.Execute

Các vấn đề liên quan