Nginx 如何通过ip地址禁用对网站的直接访问

Nginx 如何通过ip地址禁用对网站的直接访问,nginx,dns,ip,server,cloudflare,Nginx,Dns,Ip,Server,Cloudflare,我在VPS上有一个网站 我遇到的问题是,当我输入服务器的IP时,它会链接到网站。 即使进入mail.domain.com,它也会做同样的事情 如何禁用该功能,以便访问者能够收到消息或被定向到域 我尝试禁用IP并在CloudFlare上发送记录,但没有成功 我的设置是: VPS on Linux Debian Nginx no control panel just command line Cloudflare DNS setup with BIND 您可以尝试在以下位置设置服务器IP地址:

我在VPS上有一个网站

我遇到的问题是,当我输入服务器的IP时,它会链接到网站。
即使进入mail.domain.com,它也会做同样的事情

如何禁用该功能,以便访问者能够收到消息或被定向到域

我尝试禁用IP并在CloudFlare上发送记录,但没有成功

我的设置是:

VPS on Linux Debian 
Nginx
no control panel just command line
Cloudflare
DNS setup with BIND

您可以尝试在以下位置设置服务器IP地址:

/etc/nginx/conf.d/default.conf
看起来是这样的:

server {
    listen 80;
    server_name localhost IP.OF.VPS.HERE;
然后可以指定子域vhost,如:

server {
        listen 80;
        server_name subdomain.domain.com;
以及主要领域,如:

server {
        listen 80;
        server_name www.domain.com domain.com;
然后重新启动Nginx:

/etc/init.d/nginx restart
每个vhost都应该有自己的*.conf文件(为了更好地组织),如:


您可以使用重定向、nginx配置:

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

您只需在其他指令之前添加一个服务器指令

server {
    listen 80;
    server_name _;
    return 404;
}
您需要指定
default\u server
参数,以便所有不可用的服务器请求都转到该
服务器块
,该块抛出
444错误

444:连接已关闭,无响应


参考:

您可以返回任何您认为合适的错误。可以在此处找到错误列表


您可以使用重定向、nginx配置:

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

把它放在
/etc/nginx/conf.d/SERVER\u IP\u ADDRESS.conf
文件的顶部,并注释下面的所有内容

#disabling accesing server by ip address
server {
        listen SERVER_IP_ADDRESS:80 default;
        server_name _;
        return 404;
}
然后重新启动Nginx服务器(在Ubuntu上通过
服务Nginx restart
此命令完成)



现在,当您将服务器的ip地址放入浏览器url字段时,将出现404错误。

如果它是apache服务器,您可以使用.htaccess。修复了一些语法和格式问题。这里要解决的具体问题是,必须显式定义ip地址,并使用403或类似的代码重定向或阻止ip地址。我在配置中删除了对我的IP地址的所有引用,但它仍然显示在IP中——这让我发疯。但它似乎又回到了允许IP访问,如果不被覆盖的话。谢谢这也只适用于我,当listen指令也有确切的IP时,否则nginx匹配一个更具体的服务器块,尽管服务器名称不匹配。如何根据访问者执行
返回301
:如果是本地的,nginx应该重定向到192.168..,如果是远程的,然后domain.com.将其放入
/etc/nginx/conf.d/default.conf
谢谢,这对我很有用,但我的应用程序仍然可以使用
IP\u地址访问:
。我如何解决这个问题?是否会自动读取所有
*.conf
文件?或者我需要将它们包含在某个地方吗?@luckyndonald nginx.conf会自动将conf.d目录下的所有文件包含在
include/etc/nginx/conf.d/*.conf中你应该解释一下
444
的意思。我以前没见过那个。关于
https
?@mahfuz对于https,您可以添加listen443ssl;对于https,您需要创建自签名证书。在没有证书的情况下,不可能对https请求进行444响应。如果其他服务器块中的一个具有默认\u服务器
,这是否可行?
\u
是否有特殊含义?From:在catch all server示例中,可以看到奇怪的名称“\u:…这个名称没有什么特殊之处,它只是无数无效域名中的一个,这些域名从不与任何真实名称相交。其他无效的名称,如“-”和“!@#”也可以同样使用。@mpen如果另一个设置
default\u服务器
,它将不起作用<代码>\uu没有特殊意义,您可以使用任何东西。欢迎使用堆栈溢出!请注意,虽然代码片段本身可能是一个有用的答案,但最好给未来的读者留下一些注释,说明为什么这可以解决问题。谢谢这个解决方案的问题是,您需要预先知道服务器的IP地址。新事物(比如在分布式体系结构上运行)经常会将您的nginx移动到不同的IP。
server {
        listen 80;`enter code here`
        server_name IP_ADDRESS;
        return 301 http://YOUR.DOMAIN;
}
#disabling accesing server by ip address
server {
        listen SERVER_IP_ADDRESS:80 default;
        server_name _;
        return 404;
}