Иногда приходится сталкиваться с подобными задачами. Вот нашел статью, которой сам часто пользуюсь. Сразу скажу — я не считаю себя большим спецом в этом. Так что не задавайте мне по этой теме вопросов. Не смогу ответить. Тем более, что в данном вопросе очень много нюансов касательно каждого сайта в отдельности. Статью использую как пример для себя, Всё равно приходится как-то подстраиваться в каждом конкретном случае. Поэтому и предлагаются различный варианты. Не сработал один, должен сработоать другой…
Три важных совета (не мои) и десятки конкретных примеров установки 301 переадресации страниц через htaccess!
Советы
- Располагайте переадресации страниц в файле от частных к более глобальным (сверху вниз). Например: простая переадресация двух страниц стоит выше, чем глобальное правило редиректов с www на без www.
- Избегайте двух, трех и т.д. последовательных редиректов. Правила должны быть настроены так, что при возникновении редиректа он должен перенаправлять пользователя (робота) только один (!) раз. Каждая лишняя переадресация – это секунды драгоценного времени отдачи страницы, это нагрузка на сервер, это нечеткие команды для поисковых роботов.
- Не забывайте, что многие браузеры кешируют (запоминают редиректы), поэтому проверять переадресации лучше на сайте — http://www.bertal.ru.
Правила переадресаций
По умолчанию обычно от отключен. Чтобы включить этот модуль, требуется прописать в файл .htaccess «RewriteEngine on»:
RewriteEngine on |
А чтобы полностью корректно инициировать действие этого расширения в отношении вашего сайта, нужно прописать следующие строки:
Options +FollowSymLinks |
Первая строчка позволяет обрабатывать файлы, находящиеся физически за пределами объектной директории, но на которые существуют ярлыки, в общем по аналогии с ярлыками в Виндоус.
Вторая, как я уже сказал, включает сам модуль mod_rewrite. Ну а третья (RewriteBase /) позволяет обрезать полный путь от корня сервера до корневой директории сайта с тем, чтобы последующие директивы были применены именно к URL-адресам сайта. Если этого не сделать, могут возникнуть проблемы.
Простой знак слеша «/» здесь обозначает относительный путь для главной страницы (или до корневой папки) и используется при формировании относительных ссылок. Если вы пожелаете прописать сразу несколько директив по 301-му редиректу, выше означенные строчки повторять перед каждым правилом не нужно.
1. 301 редирект с одной страницы на другую
Самый простой вариант
1 |
Redirect 301 /test-1/ http://site.ru/test-2/ |
Более подробный
1 2 |
RewriteCond %{REQUEST_URI} ^/test/$ RewriteRule ^.*$ http://site.ru/new-test/? [R=301,L] |
2. 301 редирект с www на без www (главное зеркало – домен без www)
1 2 |
RewriteCond %{HTTP_HOST} ^www.(.*)$ RewriteRule ^(.*)$ http://%1/$1 [L,R=301] |
или
1 2 3 4 |
RewriteEngine On RewriteCond %{SERVER_PORT} ^443$ [OR] RewriteCond %{HTTPS} =on RewriteCond ^(.*)$ http://site.ru/$1 [R=301,L] |
3. 301 редирект с без www на www (главное зеркало – домен с www)
1 2 |
RewriteCond %{HTTP_HOST} ^([^www].*)$ RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301] |
4. 301 редирект со страниц со слешем на без слеша (убрать слэш, весь сайт)
1 2 3 4 5 6 |
RewriteCond %{REQUEST_URI} !? RewriteCond %{REQUEST_URI} !& RewriteCond %{REQUEST_URI} != RewriteCond %{REQUEST_URI} !. RewriteCond %{REQUEST_URI} ![^/]$ RewriteRule ^(.*)/$ /$1 [R=301,L] |
или
1 2 3 |
RewriteCond %{HTTP_HOST} (.*) |
5. 301 редирект со страниц без слеша на слеш — добавить слэш (часто в CMS системах устанавливается автоматически)
1 2 3 4 5 6 |
RewriteCond %{REQUEST_URI} !? RewriteCond %{REQUEST_URI} !& RewriteCond %{REQUEST_URI} != RewriteCond %{REQUEST_URI} !. RewriteCond %{REQUEST_URI} !/$ RewriteRule ^(.*[^/])$ /$1/ [R=301,L] |
или
1 2 3 |
RewriteCond %{REQUEST_FILENAME} !-f |
или
1 2 3 4 5 |
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.html) RewriteCond %{REQUEST_URI} !(.jpg) RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ https://www.site.ru/$1/ [L,R=301] |
Заменить на свой домен. Проверено лично.
6. Один (а не два последовательных!) 301 редирект на без www и со слешем на конце адреса страницы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 редирект на c www и со слешем на конце адреса страницы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 редирект на c www и без слеша на конце адреса страницы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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 и без слеша на конце адреса страницы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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 редирект только адреса site.ru/index.php (без GET параметров) на основное зеркало site.ru
1 2 3 |
RewriteCond %{REQUEST_URI} /index.php RewriteCond %{QUERY_STRING} ^z RewriteRule ^(.*)$ http://site.ru/? [R=301,L] |
11. 301 редирект всех адресов с index.php и GET параметрами на страницы только с GET параметрами (вырезать в url index.php)
Пример: типа site.ru/index.php?n=1 на site.ru/?n=1
1 2 |
RewriteCond %{REQUEST_URI} /index.php RewriteRule ^(.*)$ http://site.ru/ [R=301,L] |
12. 301 редирект для index.php, index.html или index.htm (например в Joomla), массовая склейка
1 2 |
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.(php|html|htm) HTTP/ RewriteRule ^(.*)index.(php|html|htm)$ http://site.ru/$1 [R=301,L] |
Или просто прописать последовательно:
1 2 3 4 5 6 |
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.php HTTP/ RewriteRule ^index.php$ http://site.ru/ [R=301,L] RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.html HTTP/ RewriteRule ^index.html$ http://site.ru/ [R=301,L] RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.htm HTTP/ RewriteRule ^index.htm$ http://site.ru/ [R=301,L] |
Еще вариант:
1 2 |
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.php HTTP/ RewriteRule ^index.php$ http://site.ru/ [R=301,L] |
Просто убрать index.php в конце любой строки:
1 2 |
RewriteCond %{THE_REQUEST} /index.php(/(.*?))? [NC] RewriteRule ^(.*?)index.php(/(.*?))?$ /$1$2 [L,R=301,NC,NE] |
Соответственно, чтобы убрать что-то типа home.php, нужно написать:
1 2 |
RewriteCond %{THE_REQUEST} /home.php(/(.*?))? [NC] RewriteRule ^(.*?)home.php(/(.*?))?$ /$1$2 [L,R=301,NC,NE] |
Проверено лично.
13. Убрать окончание .html в конце ссылки
1 вариант
1 2 3 4 5 6 7 8 |
RewriteEngine on RewriteBase / RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /([^.]+).html HTTP RewriteRule ^([^.]+).html$ site.ru/$1 [R=301,L] RewriteCond %{REQUEST_URI} !(.[^./]+)$ RewriteCond %{REQUEST_fileNAME} !-d RewriteCond %{REQUEST_fileNAME} !-f RewriteRule (.*) /$1.html |
Вместо site.ru вписать свой домен
2 вариант (если дублируется домен в адресной строке, изменить 4 строку)
1 2 3 4 5 6 7 8 |
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 |
14. 301 редирект url с GET параметрами (динамический URL) на статический
1 вариант (простой адрес с GET параметром)
1 2 |
RewriteCond %{QUERY_STRING} ^id=229 RewriteRule ^.*$ /supermodel/? [R=301,L] |
2 вариант (со страницы и GET параметром)
1 2 3 |
RewriteCond %{REQUEST_URI} /test/ RewriteCond %{QUERY_STRING} ^id=229 RewriteRule ^.*$ /supermodel/? [R=301,L] |
15. Все страницы одного домена на главную страницу другого домена
1 2 |
RewriteCond %{REQUEST_URI} (.*) RewriteRule ^(.*)$ http://site.ru/ [L,R=301] |
16. Каждая страница одного домена на такой же адрес другого url
1 2 |
RewriteCond %{REQUEST_URI} (.*) RewriteRule ^(.*)$ http://site.ru/$1 [L,R=301] |
17. Редирект с протокола http на https.
1 2 |
RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] |
Если возникает циклический редирект, то воспользуйтесь этим вариантом:
1 2 3 |
RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] |
Еще варианты:
1 2 |
RewriteCond %{HTTPS} =off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L] |
1 2 |
RewriteCond %{SERVER_PORT} !^443$ RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L] |
1 2 |
RewriteCond %{ENV:HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] |
1 2 |
RewriteCond %{HTTP:X-HTTPS} !1 RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] |
1 2 3 |
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"' RewriteRule ^(.*)$ <a href="https://www.domain.com/https://www.domain.com/$1">https://www.domain.com/https://www.domain.com/$1</a> [L] #не забудьте заменить на ваш домен |
1 2 |
RewriteCond %{HTTP:X-Forwarded-Protocol} !=https RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] |
1 2 3 |
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] |
18. Редирект с протокола https на http.
Обратный редирект, если перестали использовать SSL сертификат.
1 2 |
RewriteCond %{HTTPS} =on RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L] |
19. Редирект при появлении нескольких слэшей или тире
По разным причинам бывает, что в адресе появляются лишние слэши или тире, например www.site.com/catalog////page-1.html. Такие страницы нужно переадресовывать на адреса с одним слэшем http://www.site.com/catalog/page-1.html.
1 2 |
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ |
Таким же образом убираются и лишние тире в адресе, например изменение http://www.site.com/catalog/page—1.html на http://www.site.com/catalog/page-1.html.
1 2 |
RewriteCond %{REQUEST_URI} ^(.*)--(.*)$ |
.htaccess — лишние слэши после имени домена
- http://site.com//////catalog
Чтобы убрать все эти слэши так, чтобы было перенаправление на страницу без слэшей, т.е.
- http://site.com/catalog
Нужно прописать (но этот вариант убирает еще и все после повторяющихся слэшей):
1 2 |
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ |
или
1 2 3 4 |
|
Это твариант убирает слэши и в конце, и в середине ссылки. Проверен лично.
20. Редирект с любого URL на URL в нижнем регистре
1 2 3 4 5 6 7 |
$lowerURI=strtolower($_SERVER['REQUEST_URI']); |
21. Удалить часть URL
1 2 |
RewriteCond %{REQUEST_URI} ^/news/(.*)$ |
Синтаксис и символы
. — Точка означает любой символ.
[abc] — перечень символов, совпадающих с буквами a, b, или с.
[^abc] — перечень символов, не входящих в диапазон. Условию соответствует любой символ, кроме a, b, с.
* — предыдущий символ может повторяться 0 и более раз.
[abc]* — найти символы из заданного набора идущие подряд.
[^abc]* — обратная операция.
.* — замена любого набора символов. «.*» — найти все подстроки между кавычками.
^ — обознает начало строки (при использовании в начале выражения).
$ — конец строки.
w — буква, цифра или подчёркивание _.
d — любая цифра.
D — любой символ, кроме цифр.
[0-9] — указание на любую цифру.
[a-z] — указание на любую букву от a до z с нижним регистром.
[A-Z] — указание на любую букву от A до Z с верхним регистром.
[a-zA-Z] — любая буква от a до Z, регистр не важен.
[a-Z] — тоже самое, только короче.
Флаги для доп. опций
NC — NoCase отключает проверку регистра символов при срабатывании правила.
R — Redirect останавливает изменение URL-адреса и возвращает результат. Самое популярное значение R=301, однако встречаются и другие для временных редиректов (302, MOVED TEMPORARY).
L — Last останавливает создание URL-адреса и строка считается окончательной.
Комментарии отсутствуют