Mozilla SSL 配置生成器省略了server_name
生成 NGINX 配置时的指令(例如,参见适用于 NGINX 1.22.1 和 OpenSSL 3.0.2)。
在阅读了几个相关文档和主题(见底部)后,我得出的结论是,这可能是因为配置是假设只提供一个站点进行服务。
我打算这样做:通过 HTTPS 为一个站点提供服务。因此,如果我复制该配置,则server_name
每个块中的配置都会解析为空字符串server
。我误解了什么吗?
忽略server_name
不安全因素难道不是一种不好的做法吗?
- (NGINX 文档)服务器名称
- (NGINX 文档)nginx 如何处理请求
- (服务器故障)nginx 不尊重 server_name 值
- (服务器故障)ubuntu - 没有 server_name 且仅使用静态 IP 地址的 nginx?
- (服务器故障)default_server 真的需要 server_name 吗?(Nginx)
- (服务器故障)ssl - 正确设置 https 的“默认” nginx 服务器
答案1
处理 NGINX 配置的简化流程图listen
仅在端口上:
但是,这可以很容易地推广到listen <IP_ADDRESS>:<PORT>
声明;请参阅此答案底部的 NGINX 文档的引用。
例子
1. Mozilla SSL 配置生成器生成的 NGINX 配置
要点问题中引用的配置:
server {
listen 80 default_server;
listen [::]:80 default_server;
# ... instructions ...
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
# ... instructions ...
}
作为理查德·史密斯在他的评论中说,这两个server
块分别是针对端口 80 和 443 的请求的默认块,接受任何域;如果server_name
块中有声明,它们就无关紧要了。
例如,端口 443 上的 HTTPS 请求将完全跳过第一个块,因为该default_server
声明仅适用于端口 80 上的请求。
2. 将域名的所有 HTTP 请求重定向到 HTTPS
从此服务器故障线程:
#############
# CATCH-ALL #
#############
server {
listen 80 default_server;
server_name _;
return 404;
}
##########################
# HTTP-to-HTTPS redirect #
##########################
server {
listen 80;
server_name ourdomain.com;
return 301 https://ourdomain.com$request_uri;
}
#########
# HTTPS #
#########
server {
listen 443 default_server ssl http2;
# ... instructions ...
}
示例请求:
http://ourdomain.com/about
NGINX将要
server_name
看到有两个处理 80 端口的块后再查看指令,会匹配第二个。http://random-domain.org/
在哪里,因为某些原因,域名仍然解析为运行上述配置的 NGINX 服务器的 IP 地址没有任何
server
方块listen
端口 80 上的 ing 将匹配,因此默认值将简单地返回 404。注意:要使 catch-all
server
块正常工作,它必须声明
server_name _;
,并且它必须是该端口的默认服务器(可以是隐式的,通过成为该端口上第一个出现的服务器,也可以是显式的,通过使用
listen ... default_server ...;
)。
看服务器名称NGINX 文档中的文章。
在上述任何一种情况下,server_name
都可以在处理 HTTPS 的块中省略server
,因为它是唯一一个监听 443 的块。
注意自我:listen
的default_server
参数可以在同一个配置文件中多次使用. 来自文档:
如果存在该
default_server
参数,将导致服务器成为指定对的默认服务器address:port
。 -链接到段落
上面的示例配置可以写成下面这样(基于此服务器故障线程):
server {
listen 80 default_server;
listen [::]:80 default_server;
# ... instructions ...
}
server {
listen 443 default_server ssl http2;
listen [::]:443 default_server ssl http2;
# ... instructions ...
}