我正在尝试为我的网站设置 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.com
301 重定向到https://example.com
(标头中的 STS)。然后https://example.com
重定向到https://www.example.com
(标头中的 STS)。
但是,当我尝试自己的域名时,我只在初始重定向时获得 STS 标头,而没有获得到https://www.
子域名的下一次重定向。
来自我自己的测试的示例:
http://example.co.uk
(301) 至https://example.co.uk
(标头中有 STS) (301) 至https://www.example.co.uk
(标头中无 STS)。http://www.example.co.uk
(301)至https://www.example.co.uk
(标头中无 STS)。https://example.co.uk
(标题中有 STS)然后(301)到https://www.example.co.uk
(标题中无 STS)。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]
这应该可行。我测试过了。