2012-04-12 5 views
13

Trong trường hợp nếu lỗi xảy ra trên trang web của tôi, tôi làm như sau:Cách trả lại trang tùy chỉnh 404 của riêng mình?

 Server.Transfer("/error.aspx"); 

và trang có mã:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ... 

    Response.StatusCode = 404; 
} 

Nếu tôi làm việc trên localhost sau đó cùng với trạng thái 404 trở cho trang, trang hiển thị 'mô tả lỗi thích hợp'.

Khi tôi xuất bản cùng một mã lên internet, tất cả các trang có lỗi vẫn được hiển thị với mã trạng thái 404, nhưng không có nội dung. Thay vào đó, họ có thông báo lỗi 404 chuẩn:

404 - Không tìm thấy tệp hoặc thư mục.

nếu dòng "Response.StatusCode = 404" nhận xét thì trang thích hợp được cung cấp nhưng có 200 mã trạng thái.

Câu hỏi: cách trả lại trang lỗi thân thiện với người dùng trong cùng một thời điểm có mã trạng thái lỗi 404?

Bất kỳ ý tưởng nào đều được hoan nghênh! Cảm ơn rất nhiều trước!

P.S. ASP.NET 4.0

+0

Tôi đã luôn thực hiện các trang 404 tùy chỉnh theo cùng một cách. 1) Chuyển sang trang lỗi 2) bản sao trang thân thiện với người dùng và 404 dưới nắp ca-pô cho rô bốt. Một trang web tôi đang cố thực hiện việc này ngay bây giờ tôi đang gặp vấn đề tương tự - nếu tôi thêm "Response.Status" thì 404 tiêu chuẩn được hiển thị - xóa response.status và bản sao trang xuất hiện nhưng trả về 200 Dự đoán không suy đoán của tôi là một cái gì đó đã thay đổi trong .NET4 framework ... – Jag

Trả lời

6

Bạn có thể thực hiện việc này bằng cách định cấu hình tệp web.config của mình. Vui lòng kiểm tra liên kết bên dưới đến một bài viết, giải thích ở cuối trang, cách hiển thị các trang lỗi tùy chỉnh khác nhau cho các trạng thái lỗi HTTP khác nhau.

12
<customErrors mode="On" defaultRedirect="~/Error/GenericErrorPage.aspx"> 

    <error statusCode="404" redirect="~/Error/404.aspx" /> 

</customErrors> 

http://msdn.microsoft.com/en-us/library/h0hfz6fc(v=vs.71).aspx

http://msdn.microsoft.com/en-us/library/aa479319.aspx

+6

Trong khi nó hoàn toàn chính xác, tôi khuyên bạn nên, nếu có thể, không sử dụng ASPX cho các trang lỗi. Nếu lỗi có liên quan đến một thứ gì đó trong công cụ ASP thì trang lỗi cũng có thể không tải được .. – justabuzz

+0

Tôi đồng ý @justabuzz, chúng tôi thực sự đã có một ứng dụng mà điều này thường xảy ra - "Hơn nữa, ASP .NET gặp lỗi khi thử để hiển thị trang lỗi tùy chỉnh cho ngoại lệ " –

+0

Tôi nghĩ trang aspx cho 404 là ok 'cos nếu lỗi đó có khả năng hiển thị 500 trang thay thế. Nhưng nếu đó là một trang aspx ... – Jag

9

Một ha!

Hãy thử điều này:

Response.TrySkipIisCustomErrors = true; 
Response.Status = "404 Not Found"; 
Response.StatusCode = 404; 

tôi tìm thấy ngay sau khi tôi thêm Response.TrySkipIisCustomErrors=true trước khi thiết lập mã trạng thái, tôi sẽ nhìn thấy bản sao trang bình thường và 404 được trả về. Nếu không có dòng này, trang IIS 404 chuẩn sẽ được hiển thị.

Ngoài ra, điều này có thể được thiết lập trong web.config như vậy:

<system.webServer> 
    <httpErrors existingResponse="PassThrough"> 
     // custom error page mappings 
    </httpErrors> 
</system.webServer> 

Điều quan trọng ở đây là existingResponse="PassThrough"

này được đưa vào IIS7 như vậy là cần thiết trên các trang web đang chạy trong chế độ tích hợp đường ống .

Để biết thêm thông: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

Cập nhật Đang cập nhật cho clarrification/biết thêm như mọi người vẫn đang tìm hữu ích này. Cần lưu ý rằng nếu bạn cần một trang 404 đơn giản, chung chung, sử dụng phương thức web.config (và tốt nhất là tạo một trang HTML thuần túy).

Phương pháp tôi mô tả hoạt động tốt nhất nếu bạn có trang web được điều khiển động hoặc CMS ở bất kỳ trang nào có khả năng trả lại 404 nhưng bạn muốn hiển thị thông tin liên quan đến khách truy cập của mình. Ví dụ: trang phiếu mua hàng đặc biệt (phiếu mua hàng/một số phiếu mua hàng) có thể tìm kiếm phiếu mua hàng (một số phiếu mua hàng) và nếu phiếu mua hàng không tồn tại, hoặc trả lại 404 dưới nắp ca-pô. Theo như khách truy cập biết rằng họ vừa được thông báo rằng phiếu mua hàng không còn khả dụng nhưng họ vẫn còn trong phần phiếu mua hàng nhưng chúng tôi cũng yêu cầu robot hủy chỉ mục URL. Sẽ khó khăn hơn nếu chỉ có một trang 404 chung chung.

2

Để hiển thị của bạn riêng trang với đúng 404 statusCode, bạn có thể sử dụng đoạn mã sau:

1) Trong web.config của bạn thêm dòng sau:

<customErrors mode="On" redirectMode="ResponseRewrite"> 
    <error statusCode="404" redirect="404.htm" /> 
</customErrors> 

và:

<httpErrors errorMode="Custom"> 
    <remove statusCode="404"/> 
    <error statusCode="404" path="404.htm" responseMode="File"/> 
</httpErrors> 

2) Thêm tệp 404.htm vào root của trang web của bạn:

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>404 - Not Found</title> 
    <meta http-equiv="refresh" content="5;url=/404-PAGE" /> 
    </head> 
    <body> 
     CONTENT 
    </body> 
</html> 

Bạn có thể thêm nội dung vào cơ thể của tập tin này và loại bỏ các refresh META hoặc đơn giản là sử dụng refresh META để mở một trang trong CMS của bạn.

1

Kết hợp các câu trả lời của Jag và adt, tôi vẫn gặp sự cố. Khi một 404 được xử lý bởi trình xử lý tệp tĩnh (như trái ngược với ASP.NET), tôi nhận được một phản hồi trống. (Trạng thái đúng là 404.)

Để khắc phục, tôi phải thêm errorMode="Custom" vào phần tử <httpErrors>. Nếu trang lỗi của bạn sử dụng ASP.NET, bạn cần phải bao gồm responseMode="ExecuteURL".

<system.web> 
    <customErrors mode="On" defaultRedirect="~/Error.aspx" redirectMode="ResponseRewrite" /> 
</system.web> 

<system.webServer> 
    <httpErrors errorMode="Custom"> 
     <remove statusCode="404" /> 
     <error statusCode="404" path="/Error.aspx" responseMode="ExecuteURL" /> 
    </httpErrors> 
</system.webServer>