例如,我的服务器位于可通过 Internet 访问的 IPv4 地址192.0.2.4
。关联的 DNS 名称是my-website.example
。
我想阻止尝试访问 的 HTTP 客户端https://192.0.2.4/
。我想允许访问 的客户端https://my-website.example
。
例如,
$ curl -v http://192.0.2.4/
可能会打印HTTP/1.1 500
(或者根本不会回复)。
$ curl -v http://my-website.example/
将打印HTTP/1.1 200
。
我如何使用 nginx 来实现这一点?
答案1
这很简单,只需编辑启用站点的配置文件并将其配置为返回 404(表示错误页面)或 444(如果您想完全关闭连接)。
server {
listen 80 my-website.example;
listen [::]:80 my-website.example;
server_name _;
return 444;
}
这是一个例子,相关的部分是您希望它命中的自定义域并通过返回参数终止连接。
更新 1:我已进行编辑server_name ";
,server_name _;
因为它似乎是造成某些系统配置错误的原因。
更新 2:如果您想使用 HTTPS 执行此操作,可以在下面找到示例配置。
server {
listen 80 my-website.example;
listen [::]:80 my-website.example;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
listen 443 my-website.example;
listen [::]:443 my-website.example;
ssl_reject_handshake on;
server_name _;
return 444;
}
我还考虑到有些系统可能无法使用 444 拒绝代码,如果您想将其更改为更为人熟知的代码,则可以使用 404。请参见以下示例:
if ($host != "my-website.example") {
return 404;
}
答案2
您需要配置默认 vhost,以便它对所有与现有 vhost 不匹配的请求返回例如 444:
server {
listen 80 default_server;
listen [::]:80 default_server;
return 444;
}
server {
listen 80;
listen [::]:80;
server_name example.com;
# Rest of vhost config
}
您还需要为您的 HTTPS 提供相应的块。
默认配置中可能已设置了默认虚拟主机。您可能需要对其进行编辑。