Я пытаюсь настроить HSTS для своего веб-сайта, но сталкиваюсь с некоторыми проблемами, связанными с HSTS и использованием www. поддомен. Я бы хотел, чтобы весь трафик HTTP и HTTPS перенаправлялся на https://www.example.co.uk
.
Я использовал информацию со следующих сайтов в качестве руководства: https://www.danielmorell.com/blog/how-to-configure-hsts-on-www-and-other-subdomains
Примеры на вышеуказанных веб-сайтах показывают заголовок strict-transport-security (STS) на всех этапах перенаправления.
Например. http://example.com
301 перенаправляет на https://example.com
(СТС в шапке). затем https://example.com
перенаправляет на https://www.example.com
(СТС в шапке).
Однако, когда я пробую свой собственный домен, я получаю только заголовок STS при первоначальном перенаправлении, а не при следующем перенаправлении на https://www.
поддомен.
Примеры из моего собственного тестирования:
http://example.co.uk
(301) на https://example.co.uk
(STS в заголовке) (301) на https://www.example.co.uk
(В заголовке нет СТС).
http://www.example.co.uk
(301) на https://www.example.co.uk
(В заголовке нет СТС).
https://example.co.uk
(STS в заголовке), затем (301) на https://www.example.co.uk
(В заголовке нет СТС).
https://www.example.co.uk
(В заголовке нет СТС).
Ниже представлена копия ответа заголовка с использованием варианта 1 выше:
http://example.co.uk
HTTP/1.1 301 Moved Permanently
Date: Mon, 04 Feb 2019 18:14:30 GMT
Server: Apache
Location: `https://example.co.uk`/
Content-Length: 237
Content-Type: text/html; charset=iso-8859-1
https://example.co.uk
/HTTP/1.1 301 Moved Permanently
Date: Mon, 04 Feb 2019 18:14:33 GMT
Server: Apache
Strict-Transport-Security: max-age=31557600; includeSubDomains;
Location: https://www.example.co.uk/
Content-Length: 241
Content-Type: text/html; charset=iso-8859-1
https://www.example.co.uk/
HTTP/1.1 200 OK
Date: Mon, 04 Feb 2019 18:14:35 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=fkjqaomopnp03uforuptdu3u17; path=/
Transfer-Encoding: chunked
Content-Type: text/html; charset=ISO-8859-1
Мой веб-сайт работает на общем сервере Apache. У меня есть действующий сертификат Let's encrypt с CN = example.co.uk
.
Я пробовал предложения по адресу: https://webmasters.stackexchange.com/questions/115125/hsts-implementation-when-using-www-tld но, похоже, это не решило мою проблему.
Мой .htaccess показан ниже:
<if "%{HTTPS} == 'on'">
Header always set Strict-Transport-Security "max-age=31557600; includeSubDomains;"
</if>
## Base Redirects ##
# Turn on Rewrite Engine
RewriteEngine On
# Redirect to secure HTTPS before changing host
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteCond %{https} off
RewriteRule ^(.*)$ https://example.co.uk/$1 [R=301,L]
# Remove trailing slash from non-filepath urls
RewriteCond %{REQUEST_URI} /(.+)/$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ https://www.example.co.uk/%1 [R=301,L]
# Include trailing slash on directory
RewriteCond %{REQUEST_URI} !(.+)/$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+)$ https://www.example.co.uk/$1/ [R=301,L]
# Force HTTPS and WWW
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [OR,NC]
RewriteCond %{https} off
RewriteRule ^(.*)$ https://www.example.co.uk/$1 [R=301,L]
Я попробовал несколько других своих поддоменов, и все они отправляют STS в своем ответе.
Итак, проблема, похоже, связана с https://www.
субдомен, несмотря на директиву includeSubDomains
присутствуя, и я не понимаю, почему и как заставить его работать. Может быть проблема с настройками сервера, если да, то какие настройки следует проверить?
Ответ частично от этот ответ.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Only set HSTS header if protocol is HTTPS
<if "%{HTTPS} == 'on'">
Header always set Strict-Transport-Security "max-age=31557600; includeSubDomains;"
</if>
# Remove trailing slash from non-filepath urls
RewriteCond %{REQUEST_URI} /(.+)/$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ https://www.example.co.uk/%1 [R=301,L]
# Include trailing slash on directory
RewriteCond %{REQUEST_URI} !(.+)/$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+)$ https://www.example.co.uk/$1/ [R=301,L]
Это должно работать. Я это тестировал.