重定向到 www. 子域时出现 HSTS 问题

重定向到 www. 子域时出现 HSTS 问题

我正在尝试为我的网站设置 HSTS,但在 HSTS 和 www. 子域的使用方面遇到了一些问题。我希望所有 HTTP 和 HTTPS 流量都重定向到https://www.example.co.uk

我一直使用以下网站上的信息作为指南:https://www.danielmorell.com/blog/how-to-configure-hsts-on-www-and-other-subdomains

上述网站上的示例在所有重定向阶段都显示了严格传输安全 (STS) 标头。

例如http://example.com301 重定向到https://example.com(标头中的 STS)。然后https://example.com重定向到https://www.example.com(标头中的 STS)。

但是,当我尝试自己的域名时,我只在初始重定向时获得 STS 标头,而没有获得到https://www.子域名的下一次重定向。

来自我自己的测试的示例:

  1. http://example.co.uk(301) 至https://example.co.uk(标头中有 STS) (301) 至https://www.example.co.uk(标头中无 STS)。

  2. http://www.example.co.uk(301)至https://www.example.co.uk(标头中无 STS)。

  3. https://example.co.uk(标题中有 STS)然后(301)到https://www.example.co.uk(标题中无 STS)。

  4. https://www.example.co.uk(标题中没有 STS)。

以下是使用上述选项 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,我不知道为什么以及如何使其工作。如果是,这可能是服务器设置的问题,应该检查哪些设置?

答案1

答案部分来自这个答案

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]

这应该可行。我测试过了。

相关内容