2012-04-12 3 views
13

В случае, если произошла ошибка на моем веб-сайте я следующее:Как вернуть собственную страницу 404?

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

и что страница имеет код:

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

    Response.StatusCode = 404; 
} 

Если я работаю на локальном хосте, то вместе с 404 статус, возвращаемый для на странице отображается «правильное описание ошибки».

После того, как я опубликовал один и тот же код в Интернете, все страницы с ошибками все еще отображаются с кодом статуса 404, но у них нет содержимого. Вместо этого у них есть стандартное сообщение об ошибке 404:

404 - Файл или каталог не найдены.

Если строка «Response.StatusCode = 404» закомментирована, тогда предоставляется соответствующая страница, но у нее есть код состояния 200.

Вопрос: как вернуть удобную страницу ошибки, которая в то же время имеет код ошибки 404?

Любые мысли приветствуются! Заранее большое спасибо!

P.S. ASP.NET 4.0

+0

Я всегда делал пользовательские 404 страницы таким же образом. 1) Перейдите на страницу с ошибкой 2) удобная копия страницы и 404 под капотом для роботов. Один сайт, на котором я пытаюсь сделать это сейчас, у меня есть точно такая же проблема - если я добавлю «Response.Status», тогда появится стандартный 404 - удалите response.status и появится копия страницы, но вернет 200 Моя необразованная догадка что-то изменилось в .NET4 framework ... – Jag

ответ

6

Вы можете достичь этого, настроив файл web.config. Пожалуйста, проверьте приведенную ниже ссылку на статью, в которой объясняется внизу страницы, как отображать различные страницы пользовательских ошибок для разных статусов ошибок HTTP.

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

Хотя это совершенно правильно, я рекомендовал бы, если возможно, не использовать ASPX для страниц с ошибками. Если ошибка связана с чем-то в двигателе ASP, тогда страница с ошибкой также может не загружаться. – justabuzz

+0

Я согласен с @justabuzz, у нас на самом деле было приложение, в котором это происходило - «Кроме того, ASP.NET столкнулся с ошибкой при попытке для отображения страницы пользовательских ошибок для исключения » –

+0

Я думаю, что страница aspx для 404 в порядке, если это ошибки, вероятно, отобразит 500 страниц. Но если это страница aspx ... – Jag

9

ха!

Попробуйте это:

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

я нашел, как только я добавил Response.TrySkipIisCustomErrors=true перед установкой кода состояния, я хотел бы видеть нормальную страницу копирования и 404 возвращается. Без этой строки отображается стандартная страница IIS 404.

С другой стороны, это может быть установлен в web.config следующим образом:

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

Ключевым моментом здесь является existingResponse="PassThrough"

Это был добавлен в IIS7, таким образом, требуется на сайтах, работающих в режиме Integrated Pipeline ,

Для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

Update Обновление для clarrification/подробнее, как люди все еще находят это полезным. Стоит отметить, что если вам нужна простая, общая страница 404, используйте метод web.config (и лучше всего сделайте это простой HTML-страницей).

Метод, который я описываю, лучше всего работает, если у вас есть сильно динамический или управляемый CMS сайт, на котором любая данная страница может потенциально вернуть 404, но вы хотите показать свою информацию, связанную с посетителем.

Например, специальная страница предложений (предложения/некоторые предложения) может сделать поиск по предложению (некоторое предложение), а если нет, то покажите альтернативные или связанные предложения, возвращая 404 под капот. Поскольку посетителю известно, что им только что сказали, что предложение больше не доступно, но они все еще находятся в разделе предложений, но мы также сообщаем роботам о том, что они не индексируют URL. Это было бы намного сложнее, если бы была только одна общая страница 404.

2

Чтобы показать собственную страницу с правильной 404 StatusCode, вы можете использовать следующий код:

1) В вашем web.config добавить следующее:

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

и:

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

2) Добавить файл 404.htm в корень вашего сайта:

<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> 

Вы можете добавить содержимое в тело этого файла и удалить метаобновление или просто использовать метаобновление, чтобы открыть страницу в вашей CMS.

1

Объединив ответы Джага и Ада, у меня все еще была проблема. Когда 404 обрабатывался статическим обработчиком файлов (в отличие от ASP.NET), я получил пустой ответ. (Состояние было правильно 404.)

Чтобы исправить это, мне пришлось добавить errorMode="Custom" в элемент <httpErrors>. Если ваша страница ошибки использует ASP.NET, вам необходимо включить 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> 
Смежные вопросы