【NGINX】如何优雅地实现80端口重定向到443端口

109Views
No Comments

共计 1052 个字符,预计需要花费 3 分钟才能阅读完成。

引子

今日有需求对一台服务器进行https改造,也就是需要实现HSTS头的设置和端口跳转。HSTS头设置是比较简单的,只需要在server块(或者location块)中加入如下代码以添加即可。

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

然后reload一下Nginx,即可看到效果。

【NGINX】如何优雅地实现80端口重定向到443端口
效果如图

不过对于端口重定向来说,就显得复杂一些,大部分网上给出的教程需要把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

结果如下,可见已经正常跳转。

【NGINX】如何优雅地实现80端口重定向到443端口
测试结果

再去SSL Labs测试一下,即可拿到A+啦!

【NGINX】如何优雅地实现80端口重定向到443端口

正文完
 
lvshujun
Copyright notice: Our original article, by lvshujun 2024-04-05 publish, total 1052 words.
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请联系站长并注明出处。
Comment(No Comments)
验证码