Я все, у меня странная проблема с перенаправлением на HTTPS в Debian под управлением Apache.
Я использую это правило перезаписи. (* скрыть IP-адрес в этом сообщении)
<VirtualHost 10.*.*.*:80>
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
ReWriteRule ^/(.*) https://%{HTTP_POST}/$1 [NC,R,L]
</VirtualHost>
Итак, только «первый раз», когда пользователь посещает сайт по http, перенаправление не работает. Есть идеи, как решить эту проблему?
Переменной HTTP_POST
не существует. Скорее всего, вы имели в виду HTTP_HOST
:
RewriteEngine on
ReWriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]
Поскольку это постоянный редирект, код ответа 301 должен быть возвращен, то по умолчанию для [R]
установлено значение 302 (Moved Temporarily).
Также обратите внимание, что проверка условия для порта, отличного от 443, не нужна, VirtualHost привязывается только к порту 80. Запросы на порт 443 никогда не дойдут до него.
Относительно рабочих вторых запросов: Включен ли HSTS в вашей конфигурации SSL? Это объясняет, почему клиенты сразу обращаются к HTTPS для последующих запросов
. Рекомендуется использовать опцию Redirect
внутри виртуального узла, как объясняется здесь . Вот фрагмент конфигурации:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.example.com
Redirect permanent / https://secure.example.com/
</VirtualHost>
<VirtualHost _default_:443>
ServerName secure.example.com
DocumentRoot /usr/local/apache2/htdocs
SSLEngine On
# etc...
</VirtualHost>
Это перенаправит все запросы на http://www.example.com
на https://secure.example.com
.