Управление редиректами - задача, которую требуется решать на каждом проекте. Наиболее частые примеры задач:
- сайт открывается как www.site.ru и как site.ru, а нужно только www.site.ru,
- сайт открывается как www.site.ru и как site.ru, а нужно только site.ru,
- на сайт ссылается много доменов, нужно чтобы все домены вели только на один выбранный,
- сайт должен переводить пользователей с протокола http на https.
Большинство владельцев сайтов, и даже некоторые начинающие разработчики не знают, как же решать подобные задачи.
А решаются они достаточно просто - через файл .htaccess в корне сайта. Могу заметить, что сама по себе эта тема достаточно сложная, но в сети можно найти достаточно «рецептов» на все случаи жизни.
Хочу сразу предупредить - этот файл нельзя редактировать через админку сайта! Почему? Все очень просто - этот файл подключается при открытии любых страниц сайта, поэтому если редактируете через текстовый редактор сайта, то любая ошибка (в т.ч. опечатка) в этом файле приведет к тому, что весь сайт упадет, и возможности исправить тем же способом уже не будет. Поэтому, редактируйте этот файл только через FTP/SSH.
А теперь сами рецепты.
Как сделать, чтобы сайт site.ru открывался как www.site.ru
RewriteCond %{HTTP_HOST} ^(.*)$ [NC] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
Как сделать, чтобы сайт www.site.ru открывался как site.ru
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Как сделать, чтобы сайт открывался только по одному адресу
RewriteCond %{HTTP_HOST} !^site.ru$ [NC] RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]
Как сделать редирект из раздела сайта на другой сайт
Redirect 301 /ru http://example.com/ru
Как сделать редирект чтобы в конце добавлялся слеш
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^.]+)(?<!/)$ /$1/ [R=301,L]
Как сделать редирект с http на https
RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Если стандартный редирект http на https не работает:
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Как сделать редирект с /index.php на / (не только для главной)
RewriteCond %{REQUEST_METHOD} =GET RewriteCond %{THE_REQUEST} ^.*/index\.php RewriteRule ^(.*)index.php$ /$1 [R=301,L]
Как удалить лишние слеши после домена
RewriteCond %{THE_REQUEST} \s/{2,} RewriteRule (.*) $1 [R=301,L]
Если нужно чтобы сайт открывался только по https://www.site.ru - альтернативный вариант
RewriteCond %{HTTP_HOST} ^site.ru$ [NC] RewriteRule ^(.*)$ https://www.site.ru%{REQUEST_URI} [R=301,L] RewriteCond %{SERVER_PORT} !^443$ [NC] RewriteRule .* https://www.site.ru%{REQUEST_URI} [R=301,L] RewriteCond %{SERVER_PORT} 443 RewriteCond %{HTTP_HOST} !^www[.].+$ RewriteRule .* https://www.site.ru%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_URI} ^/myrubric/.*$
RewriteRule ^(.*)$ http://mynewsite.ru/$1 [L,R=301]