Перенаправление Apache с HSTS

Мне нужно перенаправить все для 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]
-1
задан 12 April 2020 в 13:07
2 ответа

Предположим, у вас всего два контейнера 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 .

0
ответ дан 4 January 2021 в 10:26

Для полноты, вот более простая альтернатива 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 ].
  • с HSTS рекомендуется сначала перенаправить на HTTPS, а затем на каноническое имя.

Для перенаправления подстановочного знака *. 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/
    . . .

Таким образом, пользователь ...

  1. вводит URL http://anysub.example.com/ .
  2. Перенаправляется на https://example.com/ (или уже находится в той же конфигурации, если введено https://anysub.example.com/ , или если политика HSTS уже находится в кеше).
  3. Видит заголовок HSTS, защищая все (*.) *. Example.com включая anysub.example.com .
  4. Наконец, получает перенаправление на канонический https://www.example.com/ .
0
ответ дан 4 January 2021 в 10:26

Теги

Похожие вопросы