Как вернуть собственную страницу 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 код состояния ошибки?

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

PS ASP.NET 4.0

Ответ 2

Ха!

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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>

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

Ответ 5

Объединяя ответы Jag и Adt, у меня все еще была проблема. Когда 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>