28.06.2020, 19:24 | #1 |
Слесарь-сайтосборщик
Доцент
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645
|
Как сделать редиректы – 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 Через 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). Это "минимум миниморум" для грамотного написания редиректов через .htaccess – а дальше спрашиваем и отвечаем. |
3 пользователя(ей) сказали cпасибо: |
29.06.2020, 10:48 | #2 |
Слесарь-сайтосборщик
Доцент
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645
|
Re: Как сделать редиректы – 301 и другие
Вопрос: как сделать редирект при переносе сайта на другой домен, например с site1.com на site2.org?
Ответ: в подавляющем большинстве случаев достаточно разместить в корневом каталоге сайта файл .htaccess, состоящий всего из двух строк: Код:
RewriteEngine on RewriteRule ^(.*)$ https://site2.org/$1 [R=301,L] В других случаях необходимо добавить условие редиректа, и/или изменить правило редиректа. Например, если сервер сконфигурирован таким образом, что данный корневой каталог работает для сайтов 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] |
29.06.2020, 11:49 | #3 |
Слесарь-сайтосборщик
Доцент
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645
|
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-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] Код:
RewriteCond %{HTTP:X-HTTPS} !1 [OR] RewriteCond %{HTTP_HOST} ^www\. [NC] RewriteRule ^(.*)$ https://site.com/$1 [R=301,L] |
29.06.2020, 14:58 | #4 |
Думаю, что надо худеть
Академик
Регистрация: 22.06.2020
Сообщений: 1,791
Сказал(а) спасибо: 1,526
Получил(а) "Спасибо": 1,939
Нарушения: 0/0 (0)
Репутация: 632655
|
Re: Как сделать редиректы – 301 и другие
Sitealert, для редиректа на https достаточно универсальной проверки:
Код:
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] |
29.06.2020, 15:22 | #5 |
Слесарь-сайтосборщик
Доцент
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645
|
Re: Как сделать редиректы – 301 и другие
|
04.07.2020, 20:14 | #6 |
На серче с 01.11.2011
Аспирант
Регистрация: 02.07.2020
Сообщений: 68
Сказал(а) спасибо: 186
Получил(а) "Спасибо": 56
Нарушения: 0/0 (0)
Репутация: 2613
|
Re: Как сделать редиректы – 301 и другие
Иногда делаю на php в зависимости от логики
PHP код:
|
23.09.2020, 16:23 | #7 | ||
Слесарь-сайтосборщик
Доцент
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645
|
Re: Как сделать редиректы – 301 и другие
Цитата:
Цитата:
|
||
09.11.2020, 00:10 | #8 |
Думаю, что надо худеть
Академик
Регистрация: 22.06.2020
Сообщений: 1,791
Сказал(а) спасибо: 1,526
Получил(а) "Спасибо": 1,939
Нарушения: 0/0 (0)
Репутация: 632655
|
Re: Как сделать редиректы – 301 и другие
Ахтунг всем у кого на хостинге работает апач без фронтендов и кто проверяет https в .htaccess запросами:
Код:
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] Поэтому теперь нужно проверять порт еще,чтобы конструкция работала и на старой версии и на обновленной. То есть добавляем строку порта и наша проверка теперь выглядит вот так: Код:
RewriteCond %{SERVER_PORT} !^443$ RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] Если не добавить строку порта, то после обновы апача сайт уйдет в вечный редирект. |
Сказали спасибо: |