2011-02-21 25 views
17

Tôi có một trang aspx như trang 404 tuỳ chỉnh của tôi trên một trang web thiết lập trên IIS 7. Tôi cần phải lấy URL ban đầu mà người dùng đang cố gắng truy cập để làm một số đang xử lý trên trang 404. Bí quyết là tôi cần phải xử lý cụ thể các trang 404 không chứa phần mở rộng .aspx (ví dụ: http://example.com/testurl), không được định tuyến thông qua phần lỗi tùy chỉnh của ASP.NET. Tôi có thể cấu hình IIS để trỏ đến 404 tùy chỉnh của tôi, nhưng tại thời điểm đó tôi không biết làm thế nào để có được URL ban đầu của tôi? Có ai biết nếu điều này là có thể?Truy cập URL ban đầu trong IIS7 404 trang chuyển hướng

Cảm ơn,

Mike

+1

Bạn có may mắn với sự cố của mình không? Tôi rất sẵn lòng làm rõ câu trả lời của tôi nếu cần. – rsbarro

Trả lời

24

Vâng, nó có thể để có được URL mà gây ra lỗi 404, bạn chỉ cần phải chắc chắn rằng bạn đã IIS cấu hình đúng.

Có hai trường hợp bạn cần xử lý, một trong đó là lỗi xuất phát từ tệp .aspx hoặc trang khác được xử lý bởi .NET và trường hợp khác là lỗi xuất phát từ thư mục xấu (như trong câu hỏi của bạn , http://example.com/testurl) hoặc tên tệp (ví dụ: * .htm) không được xử lý bởi .NET. Trong IIS 7, bạn sẽ cần cấu hình một lỗi 404 tùy chỉnh trong ".NET Error Pages" trong phần "ASP.NET" cho ứng dụng web của bạn, và cũng trong "Error Pages" trong phần "IIS". Những thay đổi web.config kết thúc tìm kiếm một cái gì đó như thế này:

<system.web> 
    <!-- other system.web stuff --> 
    <customErrors defaultRedirect="/Error404.aspx" mode="On" redirectMode="ResponseRewrite"> 
     <error redirect="/Error404.aspx" statusCode="404" /> 
    </customErrors> 
</system.web> 
<system.webServer> 
    <!-- other system.webServer stuff --> 
    <httpErrors errorMode="Custom"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" prefixLanguageFilePath="" path="/Error404.aspx" responseMode="ExecuteURL" /> 
    </httpErrors> 
</system.webServer> 

Lưu ý: redirectMode = "ResponseRewrite" được liệt kê ở trên là quan trọng nếu bạn muốn trang 404 của bạn để thực sự trở lại 404 thông điệp và tôi không nghĩ rằng nó có thể được thiết lập thông qua IIS.

Trong ví dụ của mình, tôi đã tạo một trang có tên Error404.aspx để xử lý tất cả các lỗi 404. Khi một trang .NET (.aspx, v.v.) ném ra một ngoại lệ 404, tên tệp gốc có thể được tìm thấy trong biến chuỗi truy vấn aspxerrorpath. Khi một htm thông thường hoặc trang khác gây ra lỗi 404, đường dẫn ban đầu có thể được đọc từ thuộc tính Request.RawUrl. Tôi sử dụng đoạn mã sau vào trang Error404.aspx tôi để xử lý cả hai trường hợp:

public partial class Error404 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     OriginalUrl = Request.QueryString["aspxerrorpath"] ?? Request.RawUrl; 
     Server.ClearError(); 
     Response.Status = "404 not found"; 
     Response.StatusCode = 404; 
    } 

    public string OriginalUrl { get; private set; } 
} 

Theo mặc định, trang lỗi 404 sẽ không trả về một mã trạng thái 404, vì vậy bạn cần phải thiết lập nó bằng tay. Xem this post để biết thêm chi tiết.

+1

Thanks..used một sự kết hợp của điều này với bài viết này http://www.agilewebtechnologies.com/blog/post/2007/11/18/Redirects-Using-404-Error-Handling-in-ASPNET-20-on- Shared-Hosting- (Part-4) .aspx để chuyển đổi sang chuyển hướng 301. Đã thêm Response.AddHeader ("Vị trí", OriginalUrl); Response.End(); đến cuối mã của bạn trong Error404 để thực hiện công việc. – Dave

+1

cảm ơn câu trả lời rõ ràng và chi tiết của bạn. Tôi không thể tìm thấy một cái gì đó như thế này trên trang web microsoft và lãng phí hơn 1 giờ. – dvdmn

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