Loading...
X

Не работает перенаправление на HTTPS в WordPress

Это неочевидная проблема, поскольку для некоторых страниц редирект на 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]

Рекомендуется вам:


Leave Your Observation

Ваш адрес email не будет опубликован. Обязательные поля помечены *

wp-puzzle.com logo

Бесплатная карта с кэшбэком 1,5% и до 5% на остаток (Альфа-Карта) + бонус 500 рублей за первую покупку

Кредитная карта только по паспорту! Бесплатное снятие наличных

Scroll Up