Как установить заголовок HSTS из .htaccess только по HTTPS

60

Мое веб-приложение работает на другом количестве хостов, которые я контролирую. Чтобы предотвратить необходимость изменения конфигурации 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, но я застрял там. Кто знает, как это сделать?

  • 0
    Stack Overflow - сайт для вопросов программирования и разработки. Этот вопрос, кажется, не по теме, потому что он не о программировании или разработке. Смотрите, какие темы я могу задать здесь, в Справочном центре. Возможно, лучше спросить Super User или Unix & Linux Stack Exchange . Также см. Где я могу разместить вопросы о Dev Ops?
  • 5
    @jww .htaccess файлы являются частью моего репо веб-приложения и поддерживаются разработчиками, чтобы получить желаемое поведение приложения (например, кэширование, переписывание URL-адресов и установка правильных заголовков). Вопрос рассматривается здесь почти 20 тыс. Раз (для тегов [apache], [.htaccess] и [mod-headers]). Так что я не думаю, что это не по теме здесь.
Показать ещё 1 комментарий
Теги:
.htaccess
mod-headers

4 ответа

89
Лучший ответ

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

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
  • 4
    я могу подтвердить это работает
  • 2
    в каком файле сделан этот параметр?
Показать ещё 7 комментариев
17

Чтобы построить ответ 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>
  • 5
    Это немного более безопасно, да - если вы только собираетесь использовать HTTPS во всем вашем домене. Если нет, то это невероятно опасно - и поэтому безответственно предлагать это без предупреждения об этом. Допустим, ваш веб-сервер отвечает этим заголовком на запрос в домене верхнего уровня (example.com) - тогда, когда вы включаете субдомены, любой другой поддомен, обслуживаемый другим веб-сервером только через http, а не https (например, intranet.example.com) , не будет работать. Включение тега предварительной загрузки также позволяет отправить его в список предварительной загрузки, чтобы он был жестко закодирован в веб-браузерах и затем стал необратимым.
  • 1
    Честный комментарий, ответ обновлен.
Показать ещё 1 комментарий
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 искать их при каждом доступе к вашему серверу. Поскольку также ищутся родительские каталоги, это займет некоторое (небольшое) количество времени и может повлиять на производительность вашего сервера. Источник

  • 0
    Apache всегда будет искать файлы .htaccess. Поэтому, если вы не отключили поиск .htaccess, это не улучшит производительность, так как Apache все равно проверит файл.
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню