这就是我所拥有的
http://example.com ---> https://www.example.com ---> https://example.com
这就是我想要达到的目标
http://example.com ---> https://example.com
我当前的nginx配置有下面提到的行
if ($real_scheme = 'http') { return 301 https://$host$request_uri; }
其中real_scheme是从Map块派生的变量
我试图实现相同的使用地图,谁能让我知道我所犯的错误,下面是更新的配置
map $host $nonwwwhost {
~*^www.(.*) $1;
default $host;
}
if ($real_scheme = 'http') { return 301 https://$nonwwwhost$request_uri; }
我想说使用map
进行https重定向是不鼓励的,因为标准做法是分配server
块并在其中设置重定向。
总共需要3个服务器块来覆盖重定向到所需的规范域名和端口。
重定向流可以不同,但我建议遵循HSTS重定向要求。
如果你的规范域名是example.com而不是www.example.com,这些将是你的服务器块:
server {
listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
more_set_headers "Strict-Transport-Security: max-age=31536000; includeSubDomains; preload";
ssl_certificate ...;
ssl_certificate_key ...;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl http2;
more_set_headers "Strict-Transport-Security: max-age=31536000; includeSubDomains; preload";
ssl_certificate ...;
ssl_certificate_key ...;
server_name example.com;
... main website directives go here
}
这种设置确保了如果访问者首先访问http://www.example.com,他首先被重定向到https://www.example.com和https://example.com,确保他的浏览器获得相应的HSTS策略。
最后找到了使用regex表达式实现此目的的方法
map $host $nonwwwhost {
~*^www.(?<domain3>S+)* $domain3;
default $host;
}