I was using the nginx configuration taken from this post to implement redirect from http://(www.)example.com -> https://example.com:
server {
server_name www.example.com example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
<possibly other ssl directives if you have a separate cert and key for www>
server_name www.example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
ssl_certificate /path/to/server.cert;
ssl_certificate_key /path/to/server.key;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
<locations for processing requests>
}
I'd like to add HSTS to this, so am following the nginx documentation, which amounts to adding
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
to both SSL server blocks (as done above).
TLDR: Is the STS header in the second server block necessary?
However I was doing some reading around the topic, especially this blog post which seemed to think that:
...if your canonical URL is www.example.com, the includeSubDomains token will not protect example.com as this is not a subdomain of www.example.com. A solution is to make a request from www.example.com to an uncached resource on
https:// example.com
, e.g. a 1px image, and make sure that https:// example.com sets the HSTS header.
I guess this is correct, as if you go straight to canonical https://www.example.com
then it will only protect http://*.www.example.com.
However this doesn't appear an issue if your canonical URL is https://example.com
and you use includeSubDomains
. I tested it on Chrome and it did the following http://www.example.com
(307) -> https://www.example.com
(301) -> https://example.com
.
So is the Strict-Transport-Security
header in the second listen 443 ssl
www.example.com
block necessary? As a direct request to https://www.example.com
would be SSL anyway, and it would pick up the STS includeSubDomains
header on redirect from the third server block, protecting http://www.example.com
in the future.