Как сделать редиректы – 301 и другие
Добавлено: 30.06.2021, 16:48
Тема касается в основном вопросов по редиректам в файле .htaccess. Потому что те, у кого нет апача и стоит только nginx на VDS/VPS, прописывают всё, что надо, в конфигурации сервера, и подобных вопросов не задают. А вот пользователи shared-хостингов с этим сталкиваются частенько, а знаний у них не хватает.
Итак, в Apache за редирект отвечают директивы, прописываемые в двух разных модулях: mod_alias и mod_rewrite. Через mod_alias обычно делают более простые редиректы, выглядят они примерно так:Первые 3 правила эквивалентны одно другому, это простой редирект со статусом 301 с одного адреса ("/one") на другой ("https://site.com/two"). Четвёртое правило – это редирект с использованием регулярных выражений.
Через mod_rewrite можно прописать более сложный редирект, с использованием условий редиректа:Первая строка – это запуск самого модуля mod_rewrite. Не надо писать эту строку несколько раз! И в большинстве случаев в готовом файле .htaccess она уже прописана.
Вторая и третья строки - это условия редиректа, в данном случае редирект выполняется, если выполнены оба условия. Если требуется сделать редирект при выполнении хотя бы одного условия, то в конце первого условия через пробел пишут флаг [OR].
Четвёртая строка – тоже условие, но оно не сработает, потому что закомментировано символом #.
Последняя строка – это правило редиректа. Флаг [R] означает, что должен произойти внешний редирект (через браузер) на данный URL, в противном случае произойдёт рерайт адреса на внутренний файл сервера. Если написать R вместо R=301, то произойдёт редирект 302. Флаг [L] означает, что обработка данной последовательности директив закончена.
В качестве условий и входящего пути правила подразумеваются регулярные выражения, поэтому не забывайте экранировать спецсимволы регулярок обратным слэшем: \.
Обратите внимание, что входящий путь правила mod_alias начинается со слэша (/index.php), а входящий путь правила mod_rewrite – без слэша в начале (index2\.php).
Итак, в 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
Через 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]
Вторая и третья строки - это условия редиректа, в данном случае редирект выполняется, если выполнены оба условия. Если требуется сделать редирект при выполнении хотя бы одного условия, то в конце первого условия через пробел пишут флаг [OR].
Четвёртая строка – тоже условие, но оно не сработает, потому что закомментировано символом #.
Последняя строка – это правило редиректа. Флаг [R] означает, что должен произойти внешний редирект (через браузер) на данный URL, в противном случае произойдёт рерайт адреса на внутренний файл сервера. Если написать R вместо R=301, то произойдёт редирект 302. Флаг [L] означает, что обработка данной последовательности директив закончена.
В качестве условий и входящего пути правила подразумеваются регулярные выражения, поэтому не забывайте экранировать спецсимволы регулярок обратным слэшем: \.
Обратите внимание, что входящий путь правила mod_alias начинается со слэша (/index.php), а входящий путь правила mod_rewrite – без слэша в начале (index2\.php).