Как сделать редиректы – 301 и другие

Создание сайтов и их программирование, код, устранение неисправностей
Ответить
#1
Sitealert
Стажёр
Сообщения: 66
Регистрация: 30.06.2021
Получил(а) "Спасибо": 12
Предупреждения: 0
Репутация: 20

Как сделать редиректы – 301 и другие

Тема касается в основном вопросов по редиректам в файле .htaccess. Потому что те, у кого нет апача и стоит только nginx на VDS/VPS, прописывают всё, что надо, в конфигурации сервера, и подобных вопросов не задают. А вот пользователи shared-хостингов с этим сталкиваются частенько, а знаний у них не хватает.
Итак, в Apache за редирект отвечают директивы, прописываемые в двух разных модулях: mod_alias и mod_rewrite. Через mod_alias обычно делают более простые редиректы, выглядят они примерно так:
Redirect 301 /one https://site.com/two
Redirect permanent /one https://site.com/two
RedirectPermanent /one https://site.com/two

RedirectMatch 301 ^/\d+-(\w+)/(.*)$ /$1/$2
Первые 3 правила эквивалентны одно другому, это простой редирект со статусом 301 с одного адреса ("/one") на другой ("https://site.com/two"). Четвёртое правило – это редирект с использованием регулярных выражений.

Через mod_rewrite можно прописать более сложный редирект, с использованием условий редиректа:
RewriteEngine on

RewriteCond %{HTTP_HOST} ^site\.com
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^index2\.php$ /index.php [R=301,L]
Первая строка – это запуск самого модуля mod_rewrite. Не надо писать эту строку несколько раз! И в большинстве случаев в готовом файле .htaccess она уже прописана.
Вторая и третья строки - это условия редиректа, в данном случае редирект выполняется, если выполнены оба условия. Если требуется сделать редирект при выполнении хотя бы одного условия, то в конце первого условия через пробел пишут флаг [OR].
Четвёртая строка – тоже условие, но оно не сработает, потому что закомментировано символом #.
Последняя строка – это правило редиректа. Флаг [R] означает, что должен произойти внешний редирект (через браузер) на данный URL, в противном случае произойдёт рерайт адреса на внутренний файл сервера. Если написать R вместо R=301, то произойдёт редирект 302. Флаг [L] означает, что обработка данной последовательности директив закончена.
В качестве условий и входящего пути правила подразумеваются регулярные выражения, поэтому не забывайте экранировать спецсимволы регулярок обратным слэшем: \.
Обратите внимание, что входящий путь правила mod_alias начинается со слэша (/index.php), а входящий путь правила mod_rewrite – без слэша в начале (index2\.php).
#2
Sitealert
Стажёр
Сообщения: 66
Регистрация: 30.06.2021
Получил(а) "Спасибо": 12
Предупреждения: 0
Репутация: 20

Re: Как сделать редиректы – 301 и другие

Вопрос: как сделать редирект при переносе сайта на другой домен, например с site1.com на site2.org?
Ответ: в подавляющем большинстве случаев достаточно разместить в корневом каталоге сайта файл .htaccess, состоящий всего из двух строк:
RewriteEngine on
RewriteRule ^(.*)$ https://site2.org/$1 [R=301,L]
При этом предполагается, что структура URL и контент сайта по соответственным адресам сохраняются, данный корневой каталог служит только для одного сайта, и сайт будет доступен по адресу https://site2.org.
В других случаях необходимо добавить условие редиректа, и/или изменить правило редиректа. Например, если сервер сконфигурирован таким образом, что данный корневой каталог работает для сайтов site1.com и forum.site1.com, а надо перенести только forum.site1.com, то в файл .htaccess сразу после директивы "RewriteEngine on" следует внести следующие строки:
RewriteCond %{HTTP_HOST} ^forum\.site1\.com [NC]
RewriteRule ^(.*)$ https://site2.org/$1 [R=301,L]
При этом, если .htaccess служит для правильной работы другого сайта, то остальную его часть следует оставить неизменной.
#3
Sitealert
Стажёр
Сообщения: 66
Регистрация: 30.06.2021
Получил(а) "Спасибо": 12
Предупреждения: 0
Репутация: 20

Re: Как сделать редиректы – 301 и другие

Вопрос: как сделать, чтобы после переезда с http:// на https:// при запросе по http происходил обязательный редирект?
Ответ: это зависит от настроек сервера, то есть от того, какая серверная переменная изменяется при изменении запроса. Выяснить это можно несколькими способами:
- узнать у техподдержки хостинга
- посмотреть содержимое массива $_SERVER
- методом проб и ошибок.
В простейшем случае запись для редиректа выглядит следующим образом:
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://site.com/$1 [R=301,L]
Возможные варианты условия редиректа:
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTPS} =off 
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-HTTPS} !1  
RewriteCond %{ENV:HTTPS} !on
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{HTTP:X-Forwarded-Port} !^443$
RewriteCond %{HTTP:X-Forwarded-Protocol} !=https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
Возможны также разные правила редиректа, (например, если необходима универсальность для разных хостов/сайтов):
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Возможен вариант с одновременным редиректом с http на https и с www на "без www" (чтобы не происходил двойной редирект), например:
RewriteCond %{HTTP:X-HTTPS} !1 [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://site.com/$1 [R=301,L]
#4
Sitealert
Стажёр
Сообщения: 66
Регистрация: 30.06.2021
Получил(а) "Спасибо": 12
Предупреждения: 0
Репутация: 20

Re: Как сделать редиректы – 301 и другие

Немного поясню сказанное выше касательно правил редиректа, когда сайт на https.
Для редиректа с одного URL на другой обычно рекомендуют правило, которое выглядит примерно так:
RewriteRule ^old/(.*)$ /new/$1 [R=301,L]
Здесь old – старый адрес, new – новый адрес (точнее, часть адреса, изменяемая при редиректе), выражение (.*) и соответствующая ему переменная $1 – неизменяемая часть адреса. Однако когда за сервером nginx стоит сервер Apache, очень часто происходит редирект на адрес с http, а не на адрес с https, поскольку апач не видит протокола, по которому запрос пришёл на энджинкс. В результате происходит двойная переадресация: сначала апач редиректит на новый адрес с http, затем происходит редирект на адрес с https (если, конечно, такой редирект настроен). Так как лишние редиректы нежелательны, в этом случае рекомендуется указывать протокол в правиле редиректа:
RewriteRule ^old/(.*)$ https://site.com/new/$1 [R=301,L]
Если же предполагается, что файл .htaccess предназначен не для одного домена, а для нескольких (например, сервер обращается к нему по запросам к сайтам, находящимся на субдоменах), то правило приобретает следующий вид:
RewriteRule ^old/(.*)$ https://%{HTTP_HOST}/new/$1 [R=301,L]
Вместо переменной %{HTTP_HOST} сервер подставит хост, соответствующий именно тому домену, на котором находится запрашиваемый сайт.
Ответить

Вернуться в «Управление сайтами»