среда, 1 июля 2009 г.

ASP: Постоянный редирект с заголовком 301

Итак, предыстория:
Был сайт, на котором в корне показывался flash-баннер, в самом флеше была ссылка, если было нежелание просмотра оного, ну или после того как баннер покажется весь, то происходил редирект на страницу сайта. Конкретно применялась папка внутри сайта.

После некоторых корректировок на сайте в процессе поддержки сайта была намечена необходимость этот баннер убрать. Поэтому индексный файл сайта был перемещён в корень дабы удовлетворить SEO-шникам, а со старого решили делать редирект, естественно с 301-заголовком (301 header).


На Active Server Pages (ASP) это сделали так:




<%@ Language=VBScript %>
<%
' Постоянный редирект Permanent redirection
Response.Status = "301 Moved Permanently"
Response.AddHeader "Location", "http://valeev.org.ru"
Response.End %>

В Active Server Pages (ASP) Response.Redirect не делает того же самого, что и код повыше. Response.Redirect ставит заголовок адреса (location header) как показано, но однако код статуса ставится в HTTP/1.1 302 Object moved. Когда Вы ставите Location header с помощью Response.AddHeader, то код статуса должен устанавливаься вручную, иначе он будет 200 OK.

При отправке пользователю содержания страницы до заголовков, Вы получите ошибку типа: "Response object error 'ASP 0156 : 80004005'; Header Error; The HTTP headers are already written to the client browser. Any HTTP header modifications must be made before writing page content.". Обычно, этих ошибок не видно при редиректе, так как буферизация страниц включена по-умолчанию в IIS. Если хочется удостовериться, что контент не отдаётся вперёд заголовков преренаправления / редиректа, вызовите Response.Flush прямо перед ним, запретите буферизацию с помощью команды Response.Buffer = False, или отредактируйте конфигурацию IIS для запрета буферизации / кеширования страниц. Однако запрет буферизации снижает производительность веб-сервера.