2.7.1.1.3. Редиректи
Важливі моменти:
- У налаштуваннях сайту можна вмикати редирект на HTTP/HTTPS і на адресу з www або без www. При їх використанні налаштовувати аналогічний редирект у .htaccess не потрібно.
- Редиректи в .htaccess не будуть працювати для файлів, зазначених у списку статичних файлів.
- Редирект не буде спрацьовувати для URL, на початку імені файлу яких містяться символи
.ht, наприклад.htaccessабо.htpasswd. Зверніть увагу, це правило не стосується розширень файлів.htmlабо подібних до нього.
Директиви редиректу потрібно розміщувати у файлі .htaccess, розташованому в кореневому каталозі сайту, з якого має виконуватися редирект.
На інший сайт
З одного певного сайту на інший із збереженням адреси
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(www.)?example1.com [NC]
RewriteRule ^(.*) http://www.example2.com/$1 [L,R=301]
Замість example1.com підставте адресу сайту, з якого має виконуватися редирект, а замість http://www.example2.com — на який.
Всі запити до сайту на таку ж сторінку іншого
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
Замість https://example.com/ підставте ім'я іншого домену, на який має виконуватися редирект. Результат аналогічний попередньому, за винятком того, що не перевіряється доменне ім'я сайту, з якого відбувається переадресація.
Усі запити до сайту на окрему сторінку іншого сайту
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ http://example.com/desired_page/ [L,R=permanent]
Замість http://example.com/desired_page/ підставте адресу сторінки іншого сайту, на яку має виконуватися перенаправлення
З певної сторінки одного сайту на певну сторінку іншого
RewriteCond %{REQUEST_URI} ^/old/address/$
RewriteRule ^.*$ http://example.com/new/address/? [R=301,L]
Замість example.com вставте адресу нового сайту, на який має виконуватися редирект. Замість /old/address/ вкажіть сторінку, з якої потрібно виконувати редирект, а замість /new/address/ — на яку.
Для певних IP-адрес на інший сайт
RewriteEngine On
RewriteCond %{REMOTE_ADDR} X.X.X.X
RewriteRule .* https://example.com/new/address/? [R=301,L]
Замість example.com підставте адресу нового сайту, на який має виконуватися редирект, а замість /new/address/ — адресу цільового файлу або сторінки. Замість X.X.X.X вкажіть IP-адресу, для якої потрібно виконувати редирект. IP-адресу можна вказувати з урахуванням регулярних виразів.
На цей же сайт
З усіх неіснуючих піддоменів на основний
Попередньо обов'язково увімкніть обробку запитів до неіснуючих піддоменів.
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(.*).example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=permanent]
Замість example.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
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
Замість example.com підставте адресу свого сайту, для якого налаштовується редирект.
З без www на www
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*) http://www.example.com/$1 [L,R=301]
Замість example.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 вкажіть потрібне розширення.
Видалення розширення .html при наявності однойменних файлів
Наприклад, для example.com/file.html буде виконуватися редирект на example.com/file, але фактично буде відкриватися file.html.
RewriteEngine on
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP
RewriteRule ^([^.]+)\.html$ /$1 [R=301,L]
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule (.*) /$1.html
Видалення зайвих слешів
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]