![]() |
|
|
#1 |
|
Слесарь-сайтосборщик
Доцент
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645
|
Тема касается в основном вопросов по редиректам в файле .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пасибо: |
|
|
#2 |
|
Слесарь-сайтосборщик
Доцент
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645
|
Вопрос: как сделать редирект при переносе сайта на другой домен, например с 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]
|
|
|
|
|
|
#3 |
|
Слесарь-сайтосборщик
Доцент
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645
|
Вопрос: как сделать, чтобы после переезда с 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]
|
|
|
|
|
|
#4 |
|
Думаю, что надо худеть
Академик
Регистрация: 22.06.2020
Сообщений: 1,791
Сказал(а) спасибо: 1,526
Получил(а) "Спасибо": 1,939
Нарушения: 0/0 (0)
Репутация: 632655
|
Sitealert, для редиректа на https достаточно универсальной проверки:
Код:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
|
|
|
|
|
|
#5 |
|
Слесарь-сайтосборщик
Доцент
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645
|
|
|
|
|
|
|
#6 |
|
На серче с 01.11.2011
Аспирант
Регистрация: 02.07.2020
Сообщений: 68
Сказал(а) спасибо: 186
Получил(а) "Спасибо": 56
Нарушения: 0/0 (0)
Репутация: 2613
|
Иногда делаю на php в зависимости от логики
PHP код:
|
|
|
|
|
|
#7 | ||
|
Слесарь-сайтосборщик
Доцент
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645
|
Цитата:
Цитата:
|
||
|
|
|
|
|
#8 |
|
Думаю, что надо худеть
Академик
Регистрация: 22.06.2020
Сообщений: 1,791
Сказал(а) спасибо: 1,526
Получил(а) "Спасибо": 1,939
Нарушения: 0/0 (0)
Репутация: 632655
|
Ахтунг всем у кого на хостинге работает апач без фронтендов и кто проверяет 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]
Если не добавить строку порта, то после обновы апача сайт уйдет в вечный редирект. |
|
|
|
| Сказали спасибо: |