我有一个 nginx 和不同的子域:
a.mydomain.com
b.mydomain.com
c.mydomain.com
Run Code Online (Sandbox Code Playgroud)
Nginx 有 4 条规则:
1)重写规则:
server {
listen 80
server_name gl.udesk.org;
root /nowhere;
rewrite ^ https://a.mydomain.com$request_uri permanent;
}
Run Code Online (Sandbox Code Playgroud)
2)https规则:
server {
listen 443;
server_name a.mydomain.com;
root /home/a/a/public;
ssl on;
ssl_certificate conf.d/ssl/a.crt;
ssl_certificate_key conf.d/ssl/a.key;
ssl_protocols ...
ssl_ciphers ...
ssl_prefer_server_ciphers on;
location ...
}
Run Code Online (Sandbox Code Playgroud)
3)http默认规则:
server {
listen 80 default_server;
return 444;
}
Run Code Online (Sandbox Code Playgroud)
4)https默认规则:
server {
listen 443 default_server;
return 444;
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我启动 nginx 并且:
那么为什么nginx中的 https 规则配置起来如此棘手,我应该如何正确配置它们以获得与 http 版本相同的行为?
创建新证书并添加:
ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;
Run Code Online (Sandbox Code Playgroud)
现在可以工作,但我会有一个不需要任何 SSL 证书的解决方案。只需重置除https://a.mydomain.com 之外的所有 https(端口 443)子域的所有连接,无需提供证书。
小智 3
不要将端口 443 与 ssl 混合使用!Nginx 完全与端口无关。您也可以通过端口 80 提供 https。现代 nginx 版本允许
listen 1234 ssl;
Run Code Online (Sandbox Code Playgroud)
那么你就不需要ssl on;
这条线了。
但如果你想提供 https 服务,你需要指定一个证书。当您的服务器将 http 请求重写为 https 请求时,您的服务器就会输入 https。
您会收到协议错误,因为 SSL 握手是在其他任何事情之前完成的。所以return 444
没有达到。任何 SSL 握手都需要证书和私钥,以便为加密算法提供证书/私钥对。