「Nginx」- 屏蔽通过 IP 地址访问的请求

  CREATED BY JENKINSBOT

问题描述

我们的一些站点可以通过 IP 地址直接访问,虽然没有安全问题,但是通过 IP 地址直接访问,却会带来其他问题。比如,在 SEO 中,开启 IP 访问,如果有其他域名解析到我们的主机上,那对方的域名也是可以打开的,这样百度上就会出现两个一模一样的网站,就会被认为是垃圾站,一起被降权。

因此,我们希望禁止禁止这种形式的访问,并且“禁止”的含义为不做任何响应,就好像我们并不存在。

该笔记将记录:在 Nginx 中,如何禁止通过 IP 地址访问的请求,以及常见问题的处理。

解决方法

方法一、返回 404 或者重定向

在多数情况下,我们可以返回 404 或者重定向到我们的主域名:

server {
    listen 80 default_server;
    server_name ""; # 不重要
    return 404;
}

server {
        listen 80;
        server_name IP_ADDRESS;
        return 301 http://YOUR.DOMAIN;
}

default_server:表示该 server 为默认 server(用于处理通过 IP 地址访问的请求,以及那些没有绑定的域名)。如果没有 server {} 使用 default_server 指令,则使用首个 server 配置。

方法二、完全不响应请求

server {
    listen 80 default_server;
    server_name _; # 不重要
    return 444;
}

return 444:该响应码表示不响应请求,并立即关闭连接。

通过 curl 测试,将返回 curl: (52) Empty reply from server 信息。

参考文献

Module ngx_http_core_module / listen
Nginx / Server names
Blocking IPs with Nginx – DreamHost Knowledge Base
How to block access using the Server IP in NGINX? | DigitalOcean
nginx – how to disable direct access to a web site by ip address – Stack Overflow