Подтвердить что ты не робот

Как установить 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.

Я попытался установить заголовок, используя среду vars, но я застрял там. Кто знает, как это сделать?

4b9b3361

Ответ 1

По-видимому, существует доступная переменная среды HTTPS, которую можно легко использовать. Для людей с тем же вопросом:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS

Ответ 2

Чтобы построить ответ 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>

Ответ 3

Для httpd.conf (если у вас есть доступ для редактирования), вы можете использовать

<VirtualHost 65.81.122.43:443>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
</VirtualHost>

ПРИМЕЧАНИЕ. Вам нужно установить его только на HTTPS-хосте и не может быть на http-хосте.

Когда я должен и не должен использовать файлы .htaccess?

Разрешение файлов .htaccess заставит Apache искать их при каждом доступе к вашему серверу. Поскольку также ищутся родительские каталоги, это займет некоторое (небольшое) количество времени и может повлиять на производительность вашего сервера. Источник

Ответ 4

Еще одна альтернатива - всегда устанавливать заголовок и условно удалять его для не-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#header).

Ответ 5

Вы можете использовать это и поместить его в свой файл 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.comhttps://example.comhttps://www.example.com - с заголовком HSTS)

Протестировано и соответствует https://hstspreload.org