Pull to refresh

ASP.NET, HTTP 404 и SEO

Reading time2 min
Views10K
Недавно, мой SEO оптимизатор сказал мне, что недоволен тем как ASP.NET возвращает HTTP ответ в случае ситуации 404, то есть страница не найдена. Я начал ковыряться и обнаружил пару интересных моментов, которые возможно кому-то пригодятся.

1) Обычно, по умолчанию так сказать, мы ловим 404 такими настройками web.config

<customErrors defaultRedirect="GenericError.htm" mode="On">

<error statusCode="404" redirect="404.html"/>

</customErrors>


Оданко, этот подход имет проблему, о которой мне и говорил СЕО оптимизатор. Давайте проведем небольшой тест и посмотрим какой HTTP код нам вернет ASP.NET в случае 404 ошибки.



Итак, мы сначала получаем 302 (Redirect) и затем 200 то есть типа все хорошо. Но это на самом деле, как оказалось, плохо для SEO оптимизации.

Проблема : Нам нужно чтобы ASP.NET возвращял HTTP 404 код в ситуации когда страница не найдена, а не просто редиректил на страницу ошибки с кодом 200.

Решение 1

Давайте немного поменяем наш web.config и сделаем чтобы редирект происходил не на статический html файл а на .aspx

<customErrors defaultRedirect="GenericError.htm" mode="On">

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

</customErrors>


Теперь добавим в Page_Load этой 404.aspx страницы следующий код

protected void Page_Load(object sender, EventArgs e)
{
Response.StatusCode = 404;
}


Теперь давайте протестируем



Выглядит лучше, мы таки полчили 404 код на выходе, однако мой СЕО оптимизатор не доволен, так как мы все еще имеем как бы двойной ответ, то есть сначала 302 код редиректа а потом 404. Это, как мне сказали, плохо для Google поиска и нам нужно чтобы возвращался один ответ, с 404 кодом и больше ничего.

Решение 2

Давайте закомментируем наши настройки в web.config

<!--<customErrors defaultRedirect=«GenericError.htm» mode=«On»>

<error statusCode=«404» redirect=«404.html»/>

</customErrors>-->


Теперь, добавим следующий код в файл global.asax, или сначала добавим этот файл в наш проект, если вдруг его там нет. Логика кода — поймать 404 ошибку и перенаправить на нашу страницу информации об ошибке.

protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex is HttpException)
{
if (((HttpException)(ex)).GetHttpCode() == 404)
Server.Transfer("~/404.html");
}
// Код для общих ошибок
Server.Transfer("~/GenericError.htm");
}

Отлично, теперь тестим



Яхуу, мы получили наш заветный, одинокий 404 код на нашу ошибку от ASP.NET. CEO оптимизатор остался доволен, а я тоже с интересом провел врeмя :)

Может кому то поможет ;)
Tags:
Hubs:
+16
Comments56

Articles

Change theme settings