Предупреждение: ненужный заголовок HSTS через HTTP

Я хочу всегда использовать URL https:// и не www.. Поэтому я использовал следующий код в своем файле htaccess. Но я получаю предупреждение от https://hstspreload.org.

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]    

<ifModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000;
includeSubDomains; preload" 
</ifModule>

Предупреждающее сообщение приведено ниже:

Внимание! Ненужный заголовок HSTS через HTTP
Страница HTTP по адресу http://mysiteurl.com отправляет заголовок HSTS. Это не влияет на HTTP и должно быть удалено.

Пожалуйста, помогите мне избавиться от приведенного выше предупреждения. Я также пробовал использовать следующий код, но он не работает #ref. тема

 Header always set Strict-Transport-Security "max-age=31536000; 
 includeSubDomains; preload" env=HTTPS

person Md Nurullah    schedule 10.07.2017    source источник
comment
ответ здесь stackoverflow.com/questions/24144552/ и здесь stackoverflow.com/questions/38235475/   -  person pedrotester    schedule 23.12.2019


Ответы (4)


Попробуйте удалить атрибут always. Итак, сделайте следующее:

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

Вместо этого:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

Другой вариант — установить это только в HTTPS VirtualHost, а не в основной конфигурации верхнего уровня:

Сделай это:

<VirtualHost *:443>
    (All other virtual host config)
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>

Вместо этого:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
<VirtualHost *:443>
    (All other virtual host config)
</VirtualHost>

Это имеет недостаток (или преимущество, в зависимости от того, как вы на это смотрите!) Необходимость добавления к каждому VirtualHost для вступления в силу, тогда как первый вариант будет автоматически применяться ко всем виртуальным хостам HTTPS.

И пожалуйста, пожалуйста, будьте очень осторожны с предварительной загрузкой. Это не легко обратимо! Я бы настоятельно рекомендовал вам несколько месяцев работать с хорошей (т.е. безошибочной) конфигурацией — чего, похоже, вы еще не делали — перед отправкой в ​​список предварительной загрузки.

Приведем один пример, когда предварительная загрузка может вызвать у вас проблемы: предположим, вы запускаете https://www.example.com и это также отвечает на http://example.com и перенаправляет вас на https://example.com, а затем https://www.example.com (как того требует предварительная загрузка и как настроена ваша конфигурация). Тогда ваш сайт красивый и безопасный. Однако для компаний, которые повторно используют свой домен для внутренних целей (что довольно часто), это может вызвать проблемы, особенно при предварительной загрузке. Например, если вы используете незащищенный сайт, который не находится в открытом доступе по адресу http://intranet.example.com или, возможно, небезопасную разрабатываемую версию вашего сайта по адресу http://dev.example.com, затем вы можете не знать, что этот сайт теперь также должен обслуживаться через HTTPS (поскольку это поддомен example.com). Это редко срабатывает (поскольку большинство людей не посещают http://example.com или https://example.com, поэтому никогда не увидите этот заголовок HSTS в домене верхнего уровня), поэтому вы можете никогда не заметить эту потенциальную проблему во время всего тестирования. Однако, как только предварительная загрузка вступит в силу, ваш браузер узнает о HSTS в домене верхнего уровня, даже не посещая его, и вы мгновенно потеряете доступ к этим HTTP-сайтам и не сможете легко отменить это! Многие компании по-прежнему имеют множество внутренних сайтов и инструментов, обслуживаемых только через HTTP, и обновить их все до HTTPS (что, кстати, нужно сделать в любом случае!) в кратчайшие сроки будет непросто.

Чтобы обойти это, либо используйте другой домен внутри, либо вы можете установить его без includeSubDomain только в домене верхнего уровня:

<VirtualHost *:443>
    ServerName example.com
    (All other virtual host config)
    #Set HSTS at top level without includeSubDomain
    Header always set Strict-Transport-Security "max-age=31536000"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    (All other virtual host config)
    #Set HSTS at subdomain level
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>

Это не так безопасно (поскольку кто-то может настроить другие поддомены через HTTP, например http://wwww.example.com (обратите внимание на четыре буквы W) или http://fake.subdomain.com), но, по крайней мере, это не так. сломать эти HTTP-сайты. Эта настройка не будет разрешена в списке предварительной загрузки, поскольку она требует более безопасных includeSubDomains даже в домене верхнего уровня.

Если вы хотите использовать includeSubDomains даже в домене верхнего уровня, я настоятельно рекомендую включить ресурс из домена верхнего уровня в ваш HTML (даже если он перенаправляет на версию с www, поскольку HSTS по-прежнему настроен на 301s/302s). Таким образом, вы убедитесь, что посетители загружают конфигурацию HSTS на верхнем уровне еще до того, как вы предварительно загрузите. Например, вместо этого вы можете заменить свой логотип на вызов домена верхнего уровня:

<img source="https://example.com/logo.png">

Запуск с этим, небольшим сроком действия и отсутствием тега предварительной загрузки на некоторое время. Затем увеличьте срок действия. Затем, если все работает, добавьте тег предварительной загрузки обратно и отправьте в список предварительной загрузки.

Все это может показаться немного болезненным, и, возможно, вы думали обо всем этом, но предварительная загрузка может быть невероятно опасной, если ее не продумать, из-за того, что ее нелегко отменить. На мой взгляд, предварительная загрузка HSTS является излишним для большинства сайтов, хотя я согласен, что это наиболее безопасный вариант.

person Barry Pollard    schedule 11.07.2017
comment
Спасибо за все подробности - person Md Nurullah; 13.07.2017
comment
если мы удаляем всегда, это говорит об ошибке ответа: в ответе нет заголовка HSTS. - person pedrotester; 23.12.2019
comment
env=HTTPS — большинство хостов не устанавливают переменную окружения HTTPS (и очень немногие устанавливают переменную окружения HTTPS только для HTTPS-соединений — если она вообще установлена, она часто имитирует переменную сервера HTTPS), так что это то, что вам нужно. нужно будет установить себя при подключении по HTTPS. Однако я бы не рекомендовал использовать имя HTTPS, так как его путают с одноименной переменной server (которая всегда установлена). Вместо этого используйте HSTS или что-то другое, чтобы избежать путаницы/конфликтов. - person MrWhite; 02.12.2020
comment
Аргумент always обязателен для установки заголовка в каноническом ответе перенаправления без www на www (на HTTPS) (код ответа, отличный от 200). - person MrWhite; 02.12.2020

Ubuntu 18.04 apache2 Letsencryptp

nano /etc/apache2/conf-enabled/ssl-params.conf

Заголовок всегда устанавливает Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS

service apache2 restart

удалить или прокомментировать # все остальные конфигурации vhost на apache.conf с #Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS

person RichardD    schedule 03.12.2019
comment
nop теперь он говорит Ошибка ответа: в ответе нет заголовка HSTS. - person pedrotester; 23.12.2019
comment
Если вы используете аргумент env=HTTPS, вам нужно где-то установить переменную среды HTTPS, иначе заголовок никогда не будет установлен. См. мой комментарий к ответу @Barry. - person MrWhite; 02.12.2020

С помощью этого метода я решил ошибку на своем сервере на основе litespeed. Также работает для апача. Сначала добавьте этот код в свой htaccess-

# Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Затем добавьте этот код-

<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" env=HTTPS
</IfModule>
person rid1hossain    schedule 05.07.2021

Проблема в том, что вы отправляете заголовок, когда пользователь подключается с помощью HTTP

Если вы хотите заставить их использовать HTTPS, сначала выполните перенаправление, подобное этому.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
person Alexander Higgins    schedule 10.07.2017
comment
Этот ответ вообще не касается вопроса! - person Barry Pollard; 11.07.2017