共计 1053 个字符,预计需要 3 分钟阅读。
引子
今日有需求对一台服务器进行https改造,也就是需要实现HSTS头的设置和端口跳转。HSTS头设置是比较简单的,只需要在server
块(或者location
块)中加入如下代码以添加即可。
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
然后reload
一下Nginx,即可看到效果。
不过对于端口重定向来说,就显得复杂一些,大部分网上给出的教程需要把server块拆成80和443两块,80块中单独设置301跳转,可能显得太过繁琐了,故找了个办法优化一下。
优化
常见方法
先给出网上大部分的操作方法。
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
优化方法1
当不拆分server
时,可以使用location
+if
语句,判断若是http流量,则重定向。
location / {
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
}
但是需要注意的是,由于Nginx的location
中的if
语句存在一些兼容性问题,这条语句在大部分Nginx会产生全站404的错误,不建议使用。
优化方法2
由于if语句用不了,那么我们很自然地就想到了map语句,可以提供类似if语句的功能,而且兼容性较好。
可以现在http
块中定义一个$is_https
变量。(不要定义在server
块中,过不了编译)
map $scheme $is_https {
default https;
http http;
}
然后再在server块中加上跳转逻辑。
if ($is_https = http) {
rewrite ^ https://$server_name$request_uri permanent;
}
此处rewrite用上面的return 301替换亦可
可以按照规范顺便改一下HSTS头,使其只在https连接时发送
if ($is_https = https) {
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
}
测试
用curl命令测试一下。
curl -I https://cszj.wang
结果如下,可见已经正常跳转。
再去SSL Labs测试一下,即可拿到A+啦!
非常有用,感谢!!!!