如何禁止基于 IP 的 HTTP URL 访问 Nginx Web 服务器?

如何禁止基于 IP 的 HTTP URL 访问 Nginx Web 服务器?

例如,我的服务器位于可通过 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 提供相应的块。

默认配置中可能已设置了默认虚拟主机。您可能需要对其进行编辑。

相关内容