Как установить заголовок HSTS из.htaccess только по HTTPS
Мое веб-приложение работает на другом количестве хостов, которые я контролирую. Чтобы избежать необходимости изменять конфигурацию Apache каждого vhost, я добавляю большую часть конфигурации с использованием файлов.htaccess в моем репозитории, поэтому базовая настройка каждого хоста занимает всего пару строк. Это также позволяет изменить конфигурацию при развертывании новой версии. В настоящее время.htaccess (un) устанавливает заголовки, переписывает магию и контролирует кеширование UA.
Я хочу включить HSTS в приложении, используя.htaccess. Просто установить заголовок легко:
Header always set Strict-Transport-Security "max-age=31536000"
Но в спецификации четко сказано: "Хост HSTS НЕ ДОЛЖЕН включать поле заголовка STS в HTTP-ответы, передаваемые по незащищенному транспорту". Поэтому я не хочу отправлять заголовок при отправке через HTTP-соединения. См. http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14.
Я попытался установить заголовок, используя переменные среды, но я застрял там. Кто-нибудь знает, как это сделать?
3 ответа
Очевидно, существует переменная среды HTTPS, которую можно легко использовать. Для людей с таким же вопросом:
Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
Чтобы опираться на ответ nielsr, я использовал следующее в.htaccess, чтобы выполнить рекомендации по безопасному развертыванию на https://hstspreload.org/ которые жестко закодируют домен в браузер Chrome. Имейте в виду, что это приведет к принудительному использованию HSTS во всех ваших поддоменах, и что включение в список предварительной загрузки не может быть легко отменено, поэтому rtfm.
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
Вы можете использовать это и поместить в свой файл htaccess в соответствии с https://hstspreload.org/. поместите это в свой файл.htaccess.
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L,E=HTTPS:1]
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
Во-первых, он выполнит перенаправление с не https на https. и перенаправить не www https на www https с заголовком HSTS.
( http://example.com/ -> https://example.com/ -> https://www.example.com/ - с заголовком HSTS)
Протестировано и соответствует https://hstspreload.org/
За httpd.conf
(если у вас есть доступ для редактирования этого) вы можете использовать
<VirtualHost 65.81.122.43:443>
Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
</VirtualHost>
ПРИМЕЧАНИЕ. Вам нужно установить его только на HTTPS vhost, а не на http vhost.
Когда я должен и не должен использовать файлы.htaccess?
Разрешение файлов.htaccess заставит Apache искать их при каждом доступе к вашему серверу. Так как поиск родительских каталогов также выполняется, это займет некоторое (небольшое) количество времени и может повлиять на производительность вашего сервера. Источник
Еще одна альтернатива - всегда устанавливать заголовок и условно удалять его для не-ssl-соединений:
Header always set Strict-Transport-Security "max-age=31536000" early
Header unset Strict-Transport-Security env=!HTTPS
Это имеет то преимущество, что Header
Директива может использоваться как с env
состояние, а также early
флаг. С одного Header
директива, env
а также early
не могут использоваться вместе, они являются взаимоисключающими (см. официальную документацию: https://httpd.apache.org/docs/current/mod/mod_headers.html).