我有两个域指向同一台服务器,一个我们将调用home
,另一个我们将调用web
。
我在端口 80 上为 HTTP 和 443 为 HTTPS 运行 nginx。在我的服务器定义中,我定义了两个服务器:
server {
listen 80;
server_name web;
# ...
}
server {
listen 443;
server_name web;
# ...
}
Run Code Online (Sandbox Code Playgroud)
在实践中,它工作得很好。但是,当我尝试访问home
指向与 相同的 IP 地址的 时web
,我会得到服务,web
而不是得到 404 或类似信息。
如何将 nginx 配置为与服务器名称不匹配的 404 请求?我是否需要定义一个默认服务器,它只会将事情退回到 404 秒?
小智 15
对于 http:
server {
listen 80 default_server;
server_name _;
return 404;
}
Run Code Online (Sandbox Code Playgroud)
对于 https,您实际上需要将 nginx 指向 ssl 证书/密钥。根据 文档,nginx 在匹配 server_name 时只查看“主机”标头,而不查看 TLS SNI。这意味着 nginx 必须能够接受/解密 ssl 连接,然后才能检查 Host 标头。
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate <path to cert>
ssl_certificate_key <path to key>
return 404;
}
Run Code Online (Sandbox Code Playgroud)
证书/密钥可以是任何证书/密钥,例如自签名。
如果没有指定 cert/key,nginx 仍然会尝试使用这样的 default_server 并且失败,因为它不能接受 ssl 连接。
小智 6
Catchall 服务器块还需要server_name
您需要将其设置为无效值,例如_
. 这样,服务器块将不匹配任何其他主机名,只会用作最后的手段。配置将如下所示:
server {
listen 80;
listen 443 ssl;
server_name _;
return 404;
}
Run Code Online (Sandbox Code Playgroud)
配置中的第一个服务器 {} 就像一个包罗万象的东西,所以这就是显示它的原因。在listen 80 server {}之前添加类似的内容
server {
return 404;
}
server {
listen 80;
server_name web;
# ...
}
server {
listen 443;
server_name web;
# ...
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14563 次 |
最近记录: |