我有一个 nginx 反向代理,我想基本上将任何不是我特定顶级域的 url 请求重定向到 404。
到目前为止,我想我想在我的底部有这样的东西/etc/nginx/sites-enabled/site.conf
:
server {
listen 80;
if ($host != *domain.com) {
return 404 http://$host$request_uri;
}
}
但我不知道这里的确切语法。我已经在这个上面有其他重定向块,我只希望对仅 IP 主机名或其他域的任何 url 请求立即获得 404,而不是传递给后端服务器。
此外,我也有 TLS 直通,我想做同样的事情,但我完全不知道如何在流块上实现 if 语句。我的流块如下所示/etc/nginx/nginx.conf
:
stream {
map $ssl_preread_server_name $name {
server.domain.com server;
www.domain.com www;
}
upstream server {
server backendip:443;
}
upstream www {
server backendip2:443;
}
server {
listen 443;
proxy_pass $name;
ssl_preread on;
}
}
为此,我会在第一个服务器块下方实现类似的东西吗?
server {
listen 443;
if ($ssl_preread_server_name != *domain.com) {
return 404 https://$host$request_uri;
}
}
我认为为了安全起见,我还应该在带有 if 语句的这两个块的侦听行中包含 default_server ,或者这有关系吗?
我只是在这里假设很多语法,所以任何帮助将不胜感激。
我不知道如何优雅地关闭与流模块的连接,所以我不确定这是否是一个正确的解决方案,但值得一试(您可以为虚拟服务器/上游使用任何空闲端口):
更新
在对上述解决方案进行测试后,我可以确认它是可行的。但是它会产生一个错误日志条目,例如
所以经过一番思考,我尝试了这个:
可以使用以下命令创建自签名证书和密钥:
这个正确地关闭了连接。
此外,即使这样也有效:
当然,
curl
会抱怨 SSL 版本号不正确的握手尝试,并且访问日志中有一些有趣的条目,例如但错误日志很清楚。