Назад | Перейти на главную страницу

HSTS выдает проблемы при перенаправлении на www. поддомен

Я пытаюсь настроить 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. поддомен.

Примеры из моего собственного тестирования:

  1. http://example.co.uk (301) на https://example.co.uk (STS в заголовке) (301) на https://www.example.co.uk (В заголовке нет СТС).

  2. http://www.example.co.uk (301) на https://www.example.co.uk (В заголовке нет СТС).

  3. https://example.co.uk (STS в заголовке), затем (301) на https://www.example.co.uk (В заголовке нет СТС).

  4. 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]

Это должно работать. Я это тестировал.