Мне нужно перенаправить все для example.com
на https://www.example.com
с включенным HSTS. Как это сделать? Я получил конфигурацию в vhost80 и vhost443. Что исправить в этом коде:
на vhost 80
RewriteCond %{SERVER_NAME} =www.example.com [OR]
RewriteCond %{SERVER_NAME} =*.example.com [OR]
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
на vhost 443
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule (.*) https://www.example.com$1 [R=301,L]
Предположим, у вас всего два контейнера vHost. Один для порта 80 и обрабатывает запросы к обоим example.com
и www.example.com
, а другой для порта 443, который снова обрабатывает оба example.com
и только www.example.com
. Затем ...
RewriteCond% {SERVER_NAME} = www.example.com [ИЛИ] RewriteCond% {SERVER_NAME} = *. Example.com [ИЛИ] RewriteCond% {SERVER_NAME} = example.com RewriteRule ^ https: //% {SERVER_NAME}% {REQUEST_URI} [END, NE, R = постоянный]
Вам просто нужно удалить все условия, требуется только директива RewriteRule
. Например:
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [END,NE,R=permanent]
Вам также необходимо убедиться, что вы перенаправляете на то же имя хоста, поэтому используется HTTP_HOST
, а не SERVER_NAME
. (Хотя по умолчанию SERVER_NAME
совпадает с HTTP_HOST
, но это зависит от директивы UseCanonicalName
в конфигурации вашего сервера).)
Правило в контейнер vHost 443 выглядит "ОК".
Однако лучше всего вообще избегать использования mod_rewrite ... создать отдельный vHost для каждого имени хоста и вместо этого использовать более простую директиву mod_alias Redirect
.
Для полноты, вот более простая альтернатива mod_alias , предложенная MrWhite. Здесь также есть заголовки HSTS в правильном месте и, как рекомендуется, субдомены включены и с предварительной загрузкой. Сначала три перенаправляющих виртуальных хоста, а затем фактический виртуальный хост, обслуживающий контент.
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
Redirect permanent / https://www.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
Redirect permanent / https://www.example.com/
# The mandatory SSL* directives.
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
DocumentRoot /var/www/html
# The mandatory SSL* directives.
# . . . whatever else you may have here
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>
Естественно, это требует загрузки и mod_alias, и mod_headers . Заключение директив Header
внутрь разделов
позволит избежать ошибок при отсутствии модуля mod_headers, но тогда у вас не будет включен HSTS, и это называлось перенаправлением с HSTS.
Два блока
существуют, потому что:
% {SERVER_NAME}
с Redirect
]. Для перенаправления подстановочного знака *. Example.com
я бы добавил ServerAlias
к VirtualHosts *: 80
, перенаправляя сначала в домен apex, а затем снова там по HTTPS. Поскольку www
включен в *. Example.com
, вам даже не понадобится дополнительный
для него:
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias *.example.com
Redirect permanent / https://www.example.com/
. . .
Таким образом, пользователь ...
http://anysub.example.com/
. https://example.com/
(или уже находится в той же конфигурации, если введено https://anysub.example.com/
, или если политика HSTS уже находится в кеше). (*.) *. Example.com
включая anysub.example.com
. https://www.example.com/
.