Не работает перенаправление на HTTPS в WordPress
20.05.2021
Это неочевидная проблема, поскольку для некоторых страниц редирект на HTTPS работает, а для некоторых нет. Я столкнулся с этой проблемой на WordPress совершенно случайно. Поэтому если вы веб-мастер с сайтами на WordPress, то я рекомендовал бы вам тоже проверить свои сайты.
Редирект с HTTP на HTTPS делается довольно просто, в файл .htaccess нужно добавить строки:
RewriteEngine on RewriteCond %{HTTPS} !on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}
На большинстве моих сайтов я перенаправляю на HTTPS протокол именно так.
Чтобы проверить перенаправление на HTTPS, желательно смотреть на HTTP заголовки ответа, поскольку веб-браузеры имеют тенденцию открывать сайт по HTTPS, даже если вы явно указали в URL протокол HTTP, по крайней мере, я это замечал с уже ранее открытыми по HTTPS страницами.
В Linux заголовки ответа можно посмотреть командой вида (покажет и заголовки, и тело ответа):
curl -v 'URL'
А эта команда покажет только заголовки:
curl -I 'URL'
Если у вас Windows, то вы можете воспользоваться онлайн сервисом для показа HTTP заголовков.
Водим адрес сайта http://site.ru/
Получен HTTP код редиректа:
HTTP/1.1 302 Found
Нас направили на HTTPS версию:
Location: https://site.ru/
Всё работает как надо?
Продолжаем проверять. Водим адрес сайта http://site.ru/страница-на-сайте
И… получаем код 200, то есть страница была бы показана нам по указанному адресу, без перенаправления на HTTPS.
Это поведение можно наблюдать на сайтах с красивыми (ещё иногда называют SEO) адресами страниц. В WordPress эта можно выбрать в Панели управления → Настройки → Постоянные ссылки. Примеры:
День и название https://suay.ru/2021/05/20/sample-post/ Месяц и название https://suay.ru/2021/05/sample-post/ Цифры https://suay.ru/archives/123 Название записи https://suay.ru/sample-post/
Всё дело в том, чтобы любой из этих вариантов работал, WordPress в добавляет в файл .htaccess следующие строки:
# BEGIN WordPress # Директивы (строки) между `BEGIN WordPress` и `END WordPress` # созданы автоматически и подлежат изменению только через фильтры WordPress. # Сделанные вручную изменения между этими маркерами будут перезаписаны. <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
В этих строках имеются условия и правило для mod_rewrite с флагом [L], означающим, что нужно оборвать проверку по правилам mod_rewrite. В результате не доходит очередь до правила с перенаправлением HTTP на HTTPS.
То есть, строки редиректа нужно ставить до фрагмента, который сгенерирован WordPress. Попробуем:
Found The document has moved here. Additionally, a 302 Found error was encountered while trying to use an ErrorDocument to handle the request.
Ситуация изменилась, но не улучшилась.
Необходимо к правилу перезаписи добавить флаг [L], а сами эти правила разместить в файле .htaccess до фрагмента от WordPress:
RewriteEngine on RewriteCond %{HTTPS} !on RewriteCond %{REQUEST_URI} !^/.well-known/ RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L] # BEGIN WordPress # Директивы (строки) между `BEGIN WordPress` и `END WordPress` # созданы автоматически и подлежат изменению только через фильтры WordPress. # Сделанные вручную изменения между этими маркерами будут перезаписаны. <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
После этого всё будет работать именно так, как вы ожидаете. Все адреса, как заглавной так и других страниц, начинающиеся на http:// будут перенаправляться на https://
По умолчанию код будет «302 Moved Temporarily», то есть перемещено временно. При желании, вы можете выбрать код «301 Moved Permanently», то есть перемещено навсегда:
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Билеты на автобусы, паромы и поезда, в том числе стыковочные маршруты:
Авиабилеты на международные и местные направления по минимальным ценам:
Связанные статьи:
- Как определить, была ли страница загружена в iframe или на другом домене (и что с этим делать) (67.8%)
- Как поменять адрес страницы при изменении её названия в WordPress (66.1%)
- Как сбросить пароль WordPress без доступа к почте (55%)
- Безопасность сайтов на WordPress (55%)
- Как настроить автоматическое резервное копирование сайта WordPress с выгрузкой в облако (БЕСПЛАТНО) (55%)
- Заработок на купле-продаже сайтов (RANDOM - 0.5%)