ASP.NET Custom 404 - PullRequest
       24

ASP.NET Custom 404

3 голосов
/ 22 декабря 2011

У меня есть управляемый базой данных сайт ASP.NET, который использует одну страницу APSX для отображения всех страниц сайта.Таким образом, все URL-адреса сайта имеют следующий формат:

/main.aspx?page=Page+Title+One

/main.aspx?page=Another+Article+Title

К сожалению, Google проиндексировал многие несуществующие URL-адреса, в основном вырезав часть строки запроса.Например:

/main.aspx?page=Page+Title or /main.aspx?page=Page

вместо правильного:

/main.aspx?page=Page+Title+One (this is indexed by Google as well of course).

Я пытаюсь добиться, если имя страницы строки запроса не имеет соответствующей записи вмоя БД, чтобы заставить сервер 404 ошибки, во-первых, для лучшего пользовательского опыта, а затем, чтобы сказать Google, что эти страницы не существуют.

Вот мой код и не работает.Я имею в виду, что он просто отображает пустую страницу в IE 8 и ошибку в последнем Firefox:

System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.StatusCode = 404;
System.Web.HttpContext.Current.Response.Status = "404 Not Found";
System.Web.HttpContext.Current.Response.End();

Я вижу правильный код 404 в своих журналах, однако я не перенаправлен на страницу ошибок, указанную вmy web.config:

<customErrors mode="On">
      <error statusCode="404" redirect="404.aspx"/>
</customErrors>

Что я делаю не так?

Еще одна вещь, которая меня беспокоит, это то, что я успешно форсирую ошибку 404 для любых записей строки запроса, которые не имеютсовпадение в моей базе данных, разве это не повлияет на саму страницу main.aspx и на все мои существующие страницы?Вот что я имею в виду:

I 404 main.aspx? Page = Non-Existing-Title, однако мой 404 влияет на main.aspx с любыми строками запроса, включая допустимые, например, main.aspx? Page = Existing-Title.

Сайт работает на IIS6 / Win 2003.

Спасибо за вашу помощь!

Джон

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Почему бы не создать дружественные для поисковых систем URL-адреса - это довольно просто с ASP.NET маршрутизация . Вот еще один быстрый запуск для использования маршрутизации с веб-формами.

Поскольку у вас есть сайт, управляемый данными, я бы также предложил вам создать карту сайта действительных URL-адресов, скажем, ежедневно и отправлять в поисковые системы.

Что касается настраиваемых ошибок, возможно, веб-сервер (IIS6) переопределяет отображение своих собственных настраиваемых страниц ошибок - установите флажок this для управления настраиваемыми сообщениями об ошибках в конце IIS.

EDIT
В настоящее время вы видите пустую страницу 404, поскольку вы не отправляете содержимое страницы с ошибкой (ваш код устанавливает код состояния, а затем завершает ответ). Конечно, вы можете использовать настройку IIS для настройки пользовательских страниц ошибок, но если вы хотите показать свою страницу aspx, я бы посоветовал вам сделать Server.Transfer для вашей страницы ошибок (404.aspx). В 404.aspx вы должны установить код состояния на 404, но не делайте Response.End, иначе содержимое страницы с ошибкой не будет обработано.
И наконец, помните, что в браузерах есть пороговое значение для минимального размера контента на страницах ошибок, если размер контента меньше, он будет отображать свою собственную страницу ошибок. Для IE размер составляет 521 байт для ошибки 404. Смотрите это сообщение в блоге: http://perishablepress.com/press/2008/01/21/important-note-for-your-custom-error-pages/

0 голосов
/ 22 декабря 2011

Это не будет использовать пользовательские ошибки, потому что там есть страница с именем main.aspx.

Лучший способ сделать это IMHO - создать HTTPModule и выполнить там проверку.

например. от http://forums.asp.net/t/762031.aspx/1

public class ErrorModule : IHttpModule
{

    //Default implementation details left out…
    private void FakeA404(Object source, EventArgs e)
    {
        // do your URL checking here .. 
        HttpContext.Current.Response.StatusCode = 404;
    }

    public void Init(HttpApplication context)
    {
        context.AuthenticateRequest += new EventHandler(this.FakeA404);
    }

    public void Dispose(){

    }
}

Однако я согласен 100% с VinayC в отношении дружественных веб-адресов. Вы можете настроить свою маршрутизацию так, чтобы она перешла к текущему main.aspx? Page = blah + blah2 - в качестве альтернативы вы можете использовать HTTPModule (достаточно рано в цепочке, чтобы повлиять на вещи), чтобы переписать путь.

С вашими существующими ссылками я бы выполнил перенаправление 301 на новый URL, чтобы google получил обновление.

Другой вариант - использовать другой разделитель, так как obv google не нравится +. Я бы использовал подчеркивание Page_Title_One

...