Настройка редиректов (переадресаций) через .htaccess

Иногда приходится сталкиваться с подобными задачами. Вот нашел статью, которой сам часто пользуюсь. Сразу скажу — я не считаю себя большим спецом в этом. Так что не задавайте мне по этой теме вопросов. Не смогу ответить. Тем более, что в данном вопросе очень много нюансов касательно каждого сайта в отдельности. Статью использую как пример для себя, Всё равно приходится как-то подстраиваться в каждом конкретном случае. Поэтому и предлагаются различный варианты. Не сработал один, должен сработоать другой…

Три важных совета (не мои) и десятки конкретных примеров установки 301 переадресации страниц через htaccess!

Советы

  • Располагайте переадресации страниц в файле от частных к более глобальным (сверху вниз). Например: простая переадресация двух страниц стоит выше, чем глобальное правило редиректов с www на без www.
  • Избегайте двух, трех и т.д. последовательных редиректов. Правила должны быть настроены так, что при возникновении редиректа он должен перенаправлять пользователя (робота) только один (!) раз. Каждая лишняя переадресация – это секунды драгоценного времени отдачи страницы, это нагрузка на сервер, это нечеткие команды для поисковых роботов.
  • Не забывайте, что многие браузеры кешируют (запоминают редиректы), поэтому проверять переадресации лучше на сайте — http://www.bertal.ru.

Правила переадресаций

По умолчанию обычно от отключен. Чтобы включить этот модуль, требуется прописать в файл .htaccess «RewriteEngine on»:

RewriteEngine on

А чтобы полностью корректно инициировать действие этого расширения в отношении вашего сайта, нужно прописать следующие строки:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /

Первая строчка позволяет обрабатывать файлы, находящиеся физически за пределами объектной директории, но на которые существуют ярлыки, в общем по аналогии с ярлыками в Виндоус.

Вторая, как я уже сказал, включает сам модуль 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} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]

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
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]

или

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} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

Таким же образом убираются и лишние тире в адресе, например изменение http://www.site.com/catalog/page—1.html на http://www.site.com/catalog/page-1.html.

1
2
RewriteCond %{REQUEST_URI} ^(.*)--(.*)$
RewriteRule . %1-%2 [R=301,L]

.htaccess — лишние слэши после имени домена

  • http://site.com//////catalog

Чтобы убрать все эти слэши так, чтобы было перенаправление на страницу без слэшей, т.е.

  • http://site.com/catalog

Нужно прописать (но этот вариант убирает еще и все после повторяющихся слэшей):

1
2
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R,L]

или

1
2
3
4
RewriteCond %{REQUEST_URI} ^(.*?)/{2,}(.*?)$
RewriteRule . %1/%2 [L,R=301]
RewriteCond %{THE_REQUEST} //
RewriteRule .* /$0 [R=301,L]

Это твариант убирает слэши и в конце, и в середине ссылки. Проверен лично.

 

20. Редирект с любого URL на URL в нижнем регистре

1
2
3
4
5
6
7
$lowerURI=strtolower($_SERVER['REQUEST_URI']);
if($_SERVER['REQUEST_URI']!=$lowerURI)
{
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://" . $_SERVER['HTTP_HOST'] . $lowerURI);
exit();
}

21. Удалить часть URL

1
2
RewriteCond %{REQUEST_URI} ^/news/(.*)$
RewriteRule ^(.*)$ /%1 [R=301,L]
Основная часть татьи была взята отсюда и время от времени дополняется/изменяется.

Синтаксис и символы

. — Точка означает любой символ.

[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-адреса и строка считается окончательной.

Об авторе

BlackCat
administrator

Комментарии отсутствуют

Оставить комментарий

48  −  44  =