不用一键脚本或者宝塔类可视化面板的最大问题就是什么都要从零开始。虽然Debian等Linux系统已经内置了网站必备的常用程序,但对新手来说配置是一大难题,比如HTTPS的自动重定向。

HTTP和HTTPS

HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是两种常见的网络协议,前者用于传输非加密数据,后者则通过SSL/TLS协议对数据进行加密,确保数据的安全性。

两者最大的区别主要体现在安全性上,前者传输数据时是明文的,而后者通过加密技术确保了数据在传输过程中不易被窃取或篡改。同时,HTTPS还提供了身份验证功能,确保客户端连接的是正确的服务器,进一步增强了安全性。可以说,HTTPS是主流也是网站必须的。
而对于服务器来说,两者默认的监听端口也不同,前者使用80端口,而后者采用443端口。
首先来看HTTPS的nginx简单设置:

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate.pem;
    ssl_certificate_key /path/to/certificate.key;
    location / {
        # 其他配置项
    }
}

其中的证书可以通过acme.sh等来自动获取,也可以通过keytool等工具生成自签CA证书。
此时如果在浏览器中输入https://你的域名,正常应该可以打开。但如果输入的是http://你的域名,由于没有配置80端口的内容,很可能会提示错误。
开启HTTP很简单,把下面的代码加到HTTPS的前面即可:

server {
    listen 80;
    server_name example.com;

    location / {
        # 其他配置项
    }
}

好了,现在两个都能正常打开了,但前面已经提到过HTTP安全性不高,所以我们希望访问的时候能够直接跳转到HTTPS上。

重定向到HTTPS的方式

最常用的一种方式是采用return 301,设置如下:

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

在侦听80端口时, NGINX将停止处理请求,并立即将代码301(永久转移)和指定的重写URL发送到客户端,即将网址重定向到HTTPS开头的网址上。
由于上述方法是强制使用HTTPS,因此HTTP中原有的其他配置均可以删除。
该方式还有一种变种写法:

server {
    listen 80;
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate.pem;
    ssl_certificate_key /path/to/certificate.key;
    #if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
    if ($scheme = http) { return 301 https://$host$request_uri; }
}

原理都一样,不管是判断$ssl_protocol = ""还是$scheme = http,都表示非HTTPS请求,因此通过301重定向到新的URL上。
还有一种方法就是采用rewrite,设置如下:

server {
    listen 80;
    server_name example.com;
    rewrite ^(.*)$ https://$host$1 permanent;
}

两种方式都可以重写URL,但后者支持更复杂的功能(支持正则表达式),但只能返回301和302状态码。因此必要时,两者也可以联合使用。

如果希望方便获得nginx的配置,可以试试NGINX配置工具

参考资料

nginx配置http跳转https
Nginx服务器中实现HTTP到HTTPS自动重定向的详细配置指南
nginx开启ssl并把http重定向到https的两种方式

最后修改:2025 年 03 月 21 日
如果觉得我的文章对你有用,请随意赞赏