2.3.4 301 редирект через .htaccess
Правила роботи .htaccess
Редиректи грають важливу роль у веб-розробці, дозволяючи перенаправляти відвідувачів з однієї сторінки на іншу. Один із найпоширеніших типів редиректів - це 301 Moved Permanently, який повідомляє пошуковим системам і веб-браузерам, що сторінка була перенесена назавжди. Це важливий інструмент для управління структурою вашого веб-сайту, дозволяючи перенаправляти відвідувачів з однієї сторінки на іншу адресу.
У цій статті ми розглянемо приклади готових 301 редиректів з використанням файлу .htaccess, який може знаходитися як у корені вашого веб-сайту, так і бути створеним в будь-якій іншій його директорії. Кожен файл .htaccess застосовується до всіх піддиректорій всередині директорії, де він розташований. Це означає, що налаштування, визначені в .htaccess всередині конкретної директорії, будуть розповсюджуватися на всі файли та піддиректорії всередині цієї директорії.
Приклади готових 301 редиректів
1. Найпростіший варіант - 301 редирект з однієї сторінки на іншу:
Redirect 301 /example-1/ http://example.com/page-2/
Більш детальний:
RewriteCond %{REQUEST_URI} ^/page/$
RewriteRule ^.*$ http://example.com/new-page/? [R=301,L]
2. 301 редирект з www на без www (головне зеркало – домен без www):
RewriteCond %{HTTP_HOST} ^www.(.)$
RewriteRule ^(.)$ http://%1/$1 [L,R=301]
В початку файлу .htaccess потрібно додати:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.(.)$ [NC]
RewriteRule ^(.)$ http://%1/$1 [R=301,L]
3. 301 редирект з без www на www (головне зеркало – домен з www):
RewriteCond %{HTTP_HOST} ^([^www].)$
RewriteRule ^(.)$ http://www.%1/$1 [L,R=301]
4. 301 редирект зі сторінок зі слешем на без слеша (весь сайт):
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} ![^/]$
RewriteRule ^(.*)/$ /$1 [R=301,L]
5. 301 редирект зі сторінок без слеша на слеш (часто в CMS встановлений за замовчуванням):
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*[^/])$ /$1/ [R=301,L]
6. Один (а не два послідовних) 301 редирект на адресу без www і з слешем на кінці сторінки:
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{HTTP_HOST} ^www.(.)$
RewriteRule ^(.)$ http://%1/$1/ [L,R=301]
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} ![^/]$
RewriteCond %{HTTP_HOST} ^www.(.)$
RewriteRule ^(.)$ http://%1/$1 [L,R=301]
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{HTTP_HOST} ^([^www].)$
RewriteRule ^(.)$ http://%1/$1/ [L,R=301]
7. Один (а не два послідовних) 301 редирект на з www і зі слешем в кінці адреси сторінки:
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{HTTP_HOST} ^www.(.)$
RewriteRule ^(.)$ http://www.%1/$1/ [L,R=301]
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{HTTP_HOST} ^([^www].)$
RewriteRule ^(.)$ http://www.%1/$1/ [L,R=301]
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} ![^/]$
RewriteCond %{HTTP_HOST} ^([^www].)$
RewriteRule ^(.)$ http://www.%1/$1 [L,R=301]
8. Один (а не два послідовних) 301 редирект на з www і без слеша в кінці адреси сторінки:
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{HTTP_HOST} ^([^www].)$
RewriteRule ^(.)$ http://www.%1/$1 [L,R=301]
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} /$
RewriteCond %{HTTP_HOST} ^www.(.)$
RewriteRule ^(.)/$ http://www.%1/$1 [L,R=301]
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{HTTP_HOST} ^([^www].)$
RewriteRule ^(.)$ http://www.%1/$1 [L,R=301]
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} /$
RewriteCond %{HTTP_HOST} ^([^www].)$
RewriteRule ^(.)/$ http://www.%1/$1 [L,R=301]
9. Один (а не два послідовних) 301 редирект на без www і без слеша в кінці адреси сторінки:
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{HTTP_HOST} ^www.(.)$
RewriteRule ^(.)$ http://%1/$1 [L,R=301]
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} /$
RewriteCond %{HTTP_HOST} ^www.(.)$
RewriteRule ^(.)/$ http://%1/$1 [L,R=301]
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{HTTP_HOST} ^www.(.)$
RewriteRule ^(.)$ http://%1/$1 [L,R=301]
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} /$
RewriteCond %{HTTP_HOST} ^([^www].)$
RewriteRule ^(.)/$ http://%1/$1 [L,R=301]
10. 301 редирект тільки адреси example.com/index.php
(без GET-параметрів) на основне зеркало example.com
:
RewriteCond %{REQUEST_URI} /index.php
RewriteCond %{QUERY_STRING} ^\z
RewriteRule ^(.*)$ http://example.com/? [R=301,L]
11. 301 редирект всіх адрес с index.php і GET-параметрами на сторінки тільки з GET-параметрами (вирізати в URL index.php)
Приклад: редирект з example.com/index.php?n=1
на example.com/?n=1
:
RewriteCond %{REQUEST_URI} /index.php
RewriteRule ^(.*)$ http://example.com/ [R=301,L]
12. 301 редирект URL з GET-параметрами (динамічний URL) на статичний:
Варіант №1 (проста адреса з GET-параметрами):
RewriteCond %{QUERY_STRING} ^id=229
RewriteRule ^.*$ /supermodel/? [R=301,L]
Варіант №2 (зі сторінки і GET-параметром):
RewriteCond %{REQUEST_URI} /page/
RewriteCond %{QUERY_STRING} ^id=229
RewriteRule ^.*$ /supermodel/? [R=301,L]
13. Всі сторінки одного домену на головну сторінку іншого домену:
RewriteCond %{REQUEST_URI} (.)
RewriteRule ^(.)$ http://example.com/ [L,R=301]
14. Кожна сторінка одного домену на таку ж адресу іншого URL:
RewriteCond %{REQUEST_URI} (.)
RewriteRule ^(.)$ http://example.com/$1 [L,R=301]