2.12.3. Редиректы
Важные моменты:
- В настройках сайта можно включать редирект на HTTP/HTTPS и на адрес с www или без www. При их использовании настраивать аналогичный редирект в .htaccess не нужно.
- Редиректы в .htaccess не будут работать для файлов, указанных в списке статических файлов.
- Редирект не будет срабатывать для URL, в начале имени файла которых содержатся символы
.ht
, например.htaccess
или.htpasswd
. Обратите внимание, это правило не касается расширений файлов.html
или ему подобных.
Директивы редиректа нужно размещать в файле .htaccess, расположенном в корневом каталоге сайта, с которого должен выполняться редирект.
На другой сайт
С одного определённого сайта на другой с сохранением адреса
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^(www.)?сайт1.com [NC] RewriteRule ^(.*) http://www.сайт2.com/$1 [L,R=301]
Вместо сайт1.com
подставьте адрес сайта, с которого должен выполняться редирект, а вместо http://www.сайт2.com
— на который.
В качестве альтернативного варианта можно использовать веб-редирект.
Все запросы к сайту на такую же страницу другого
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} (.*) RewriteRule ^(.*)$ https://сайт.com/$1 [L,R=301]
Вместо https://сайт.com/
подставьте имя другого домена, на который должен выполняться редирект. Результат аналогичен предыдущему, за исключением того, что не проверяется доменное имя сайта, с которого происходит переадресация.
Все запросы к сайту на отдельную страницу другого сайта
RewriteEngine On RewriteBase / RewriteRule ^(.*)$ http://сайт.com/desired_page/ [L,R=permanent]
Вместо http://сайт.com/desired_page/
подставьте адрес страницы другого сайта, на которую должен выполняться редирект
С определённой страницы одного сайта на определённую страницу другого
RewriteCond %{REQUEST_URI} ^/old/address/$ RewriteRule ^.*$ http://сайт.com/new/address/? [R=301,L]
Вместо сайт.com
подставьте адрес нового сайта, на который должен выполняться редирект. Вместо /old/address/
укажите страницу, с которой нужно выполнять редирект, а вместо /new/address/
— на которую.
На этот же сайт
Cо всех несуществующих поддоменов на основной
Предварительно обязательно включите обработку запросов к несуществующим поддоменам.
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^(.*).сайт.com [NC] RewriteRule ^(.*)$ http://сайт.com/$1 [L,R=permanent]
Вместо сайт.com
подставьте адрес своего сайта, для которого настраивается редирект.
С одного файла на другой файл или страницу этого же сайта
RewriteRule ^path/to/file.php$ /new/address/ [L,R=301]
Вместо path/to/file.php
подставьте адрес файла, с которому должен выполняться редирект, а вместо /new/address/
— адрес целевого файла или страницы.
С одной страницы сайта на другую страницу этого же сайта
RewriteCond %{REQUEST_URI} ^/old/address/$ RewriteRule ^.*$ http://%{HTTP_HOST}/new/address/ [R=301,L]
Вместо /old/address/
подставьте адрес страницы, с которой должен выполняться редирект, а вместо /new/address/
— на которую.
www / без www
С www на без www
Для редиректа с www.сайт.com
на сайт.com
:
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^www.сайт.com$ [NC] RewriteRule ^(.*)$ http://сайт.com/$1 [R=301,L]
Вместо сайт.com
подставьте адрес своего сайта, для которого настраивается редирект.
С без www на www
Для редиректа с сайт.com
на www.сайт.com
:
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^сайт.com [NC] RewriteRule ^(.*) http://www.сайт.com/$1 [L,R=301]
Вместо сайт.com
подставьте адрес своего сайта, для которого настраивается редирект.
HTTP/HTTPS
С HTTP на HTTPS
RewriteEngine On RewriteBase / RewriteCond %{HTTP:SSL} !=1 [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
С HTTPS на HTTP
RewriteEngine On RewriteBase / RewriteCond %{HTTP:SSL} =1 [NC] RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
С HTTP на HTTPS для определённого каталога
RewriteEngine On RewriteBase / RewriteCond %{HTTP:SSL} !=1 [NC] RewriteRule ^admin(.*)$ https://%{SERVER_NAME}/admin$1 [L,R]
Вместо admin
подставьте название каталога, для которого настраивается редирект.
С HTTP на HTTPS для всего, кроме одного файла
RewriteEngine On RewriteBase / RewriteCond %{HTTP:SSL} !=1 [NC] RewriteCond %{THE_REQUEST} !/path/to/file.php [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Вместо /path/to/file.php
подставьте путь к файлу, для которого не должен срабатывать редирект на HTTPS.
С HTTP на HTTPS для всего, кроме определённого каталога
RewriteEngine On RewriteBase / RewriteCond %{HTTP:SSL} !=1 [NC] RewriteCond %{REQUEST_URI} !^/path/to/dir [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Вместо /path/to/dir
подставьте путь к каталогу, для которого не должен срабатывать редирект на HTTPS.
Изменение URL
Удаление index.php
php
можно указывать любой другой тип файла, который нужно удалить из адреса, к примеру html
.
RewriteEngine On RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)index\.php($|\ |\?) RewriteRule ^ /%1 [R=301,L]
Удаление расширения
Внимание!
Удаление расширения из URL может негативно сказаться на работе определённых систем, которые используют методы POST для отправки данных скрипту. Важно учитывать, что такое правило может создать проблемы в работе сайта.RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^.*$ $0.php [L,QSA] RewriteCond %{THE_REQUEST} ([^\s]*)\.php(\?[^\s]*)? RewriteRule (.*) %1 [R=301,L]
Вместо php
укажите нужное расширение.
Удаление лишних слешей
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^(.+)/$ RewriteRule ^(.+)/$ /$1 [R=301,L] RewriteCond %{THE_REQUEST} // RewriteCond %{QUERY_STRING} !http(s|):// RewriteRule .* /$0 [R=301,L]