Редирект 301 — несколько рецептов
Однажды созданный URI может быть активен неопределенно долгое время, и теоретически, не существует причины, заставляющей владельца сайта изменять адреса документов.
Как обычно, на практике все выглядит несколько более запущено — сайты меняют владельцев, тематику, движок; зачастую первоначальная дерьмовая субоптимальная структура сайта требует основательной переработки; наконец компании, стоящие за сайтом, прекращают существование.
Одним словом, такая задача часто возникает в нелегкой жизни вебмастера. Самое ужасное, что он может сделать со старыми URI — просто удалить их с сервера. (Минус пицот в карму.) Оптимальным решением служит перенаправление старых адресов на новые, с отдачей агенту пользователя заголовка 301 Moved Permanently.
Ниже описаны несколько техник, позволяющих сделать 301 редирект в разных условиях.
IIS (Internet Information Services, до версии 5.1 — Internet Information Server)
- кликнуть правой клавишей на перемещаемых файле или директории
- выбрать A redirection to a URL
- ввести адрес редиректа
- выбрать The exact url entered above и A permanent redirection for this resource
- кликнуть Apply
ColdFusion
<.cfheader statuscode="301" statustext="Moved permanently"> <.cfheader name="Location" value="http://www.new-url.com">
PHP
<? Header( "HTTP/1.1 301 Moved Permanently" ); Header( "Location: http://www.new-url.com" ); ?>
ASP
<%@ Language=VBScript %> <% Response.Status="301 Moved Permanently" Response.AddHeader "Location","http://www.new-url.com/" %>
ASP .NET
<script runat="server"> private void Page_Load(object sender, System.EventArgs e) { Response.Status = "301 Moved Permanently"; Response.AddHeader("Location","http://www.new-url.com"); } </script>
JSP (Java)
<% response.setStatus(301); response.setHeader( "Location", "http://www.new-url.com/" ); response.setHeader( "Connection", "close" ); %>
CGI PERL
$q = new CGI; print $q->redirect("http://www.new-url.com/");
Ruby on Rails
def old_action headers["Status"] = "301 Moved Permanently" redirect_to "http://www.new-url.com/" end
Старый домен на новый
На серверах под управлением Linux с включенным Mod_rewrite добавить в файл .htaccess следующие строки:
Options +FollowSymLinks RewriteEngine on RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]
Редирект на www
На серверах под управлением Linux с включенным Mod_rewrite добавить в файл .htaccess следующие строки:
Options +FollowSymlinks RewriteEngine on rewritecond %{http_host} ^domain.com [nc] rewriterule ^(.*)$ http://www.domain.com/$1 [r=301,nc]
И еще один вариант, более универсальный, т.к. не содержит названия домена:
Options +FollowSymLinks RewriteEngine on RewriteBase / RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Внешние сслылки
- w3.org: Cool URIs don’t change
- Hypertext Transfer Protocol — HTTP/1.1: 10 Status Code Definitions
Минус 500 в карму конечно круто звучит, но официально это где-то написано? А если накосячить с редиректом, можно ещё больше в бубен получить. В чём проблема то 404го? Ну нет страницы и велкам в поиск или на шлавную.
А вообще, если честно, то вопрос актуальный, щас как раз заморачиваюсь по этому поводу :( .com в индексе Google 150 страниц, а в Яше - болт, даже морда не влезла :( поэтому переезд на .ru будет экспериментом.
В связи с этим вопрос, вариант php если использовать, то достаточно 2 строчки добавить в header и всё? или лучше .htaccess переписать и с него редиректить?
Официально? Официально не знаю, но очень по матушке хочется, когда вместо “чтобы найти ответ на свой вопрос кликните здесь” получаешь “не, барин, нет такой страницы”. Поэтому лучше постараться.
Обычно перенаправляю все в .htaccess, а морду именно этими двумя строчками. Причина в том, что, как правило, переезд сопровождается изменением структуры сайта, и можно настроить все редиректы постранично, а это как раз удобно делать в .htaccess (если только их не сто пицот, блин)