如何禁用通过IP地址直接访问网站

Posted

技术标签:

【中文标题】如何禁用通过IP地址直接访问网站【英文标题】:how to disable direct access to a web site by ip address 【发布时间】:2015-05-20 05:26:57 【问题描述】:

我在 VPS 上有一个网站。

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

如何禁用它,以便访问者收到消息或被定向到域?

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

我的设置是:

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

【问题讨论】:

如果是 apache 服务器,你可以使用 .htaccess。 修正了一些语法和格式 【参考方案1】:
server 
    listen      80 default_server;
    listen      [::]:80 default_server;
    server_name "";
    return      444;

您需要指定default_server 参数,以便所有不可用的服务器请求都转到抛出444 errorserver block

444:连接关闭而没有响应

参考:https://httpstatuses.com/444

【讨论】:

您应该解释一下444 的含义。我以前没见过那个。 httpstatuses.com/444 https 呢? @mahfuz for https 你可以添加listen 443 ssl; 对于 https,您需要创建自签名证书。在没有证书的情况下无法对 https 请求进行 444 响应。 @Howard 但是 444 不是回应。 NGINX 只会在return 444; 上挂断连接。【参考方案2】:

你可以使用重定向,nginx配置:

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

【讨论】:

这里要解决的具体问题是必须明确定义 IP 地址并重定向或使用 403 等阻止。我已经删除了配置中对我的 IP 地址的所有引用,但它仍然显示为 IP - 这让我发疯了。但是,如果不被覆盖,它似乎会退回到允许 IP 访问。谢谢! 这也只适用于我当监听指令也有确切的 IP 否则 nginx 匹配一个更具体的服务器块虽然 server_name 不匹配。 如何根据访问者做一个return 301:如果是本地的,nginx应该重定向到192.168..,如果它来自远程,然后是domain.com。 把这个放到/etc/nginx/conf.d/default.conf 谢谢,这对我有用,但我的应用仍然可以使用 IP_ADDRESS:<PORT_NUM> 访问。我该如何解决?【参考方案3】:

您可以在其他人之前添加一个服务器指令。

server 
    listen 80;
    server_name _;
    return 404;

【讨论】:

如果其他服务器块之一具有default_server,这会起作用吗? _有特殊含义吗? 来自nginx.org/en/docs/http/server_names.html:在包罗万象的服务器示例中,可以看到奇怪的名称“_”:...这个名称没有什么特别之处,它只是无数无效域中的一个永远不会与任何真实姓名相交的名字。其他无效名称,如“--”和“!@#”也可以同样使用。 @mpen 如果其他集合之一default_server 将不起作用。 _没有特殊含义,什么都可以用。【参考方案4】:

你可以使用重定向,nginx配置:

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

【讨论】:

欢迎来到 Stack Overflow!请注意,虽然代码 sn-p 本身就是一个有用的答案,但最好为未来的读者留下一些评论,说明为什么这可以解决问题。谢谢! 此解决方案的问题是您需要预先知道服务器的 IP 地址。新事物(例如在分布式架构上运行)可能会经常将您的 nginx 移动到不同的 IP。【参考方案5】:

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

server 
    listen      x.x.x.x:80;
    server_name x.x.x.x;
    return      404;
  

【讨论】:

【参考方案6】:

您可以尝试将服务器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

每个虚拟主机都应该有自己的 *.conf 文件(以便更好地组织),例如:

/etc/nginx/conf.d/subdomain.domain.com.conf
/etc/nginx/conf.d/domain.com.conf
/etc/nginx/conf.d/default.conf

【讨论】:

会自动读取所有*.conf 文件吗?还是我需要将它们包含在某个地方? @luckydonald nginx.conf 自动包含 conf.d 目录下的所有文件include /etc/nginx/conf.d/*.conf;【参考方案7】:

把它放在你的 /etc/nginx/conf.d/SERVER_IP_ADDRESS.conf 文件的顶部,并评论它下面的所有内容。

#disabling accesing server by ip address
server 
        listen SERVER_IP_ADDRESS:80 default;
        server_name _;
        return 404;

然后重启你的 Nginx 服务器(在 Ubuntu 上是通过service nginx restart这个命令完成的)

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

【讨论】:

【参考方案8】:
if ($http_host != "example.com") 
    return 301 https://example.com;

【讨论】:

【参考方案9】:
server 
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 default_server;
    listen [::]:443 default_server;
    return 444;

不要费心为接收器支持 HTTP/2 或 SSL 连接。 没有那些不必要的东西,它确实包罗万象。 对于不受支持的,它只是拒绝此类连接。

见https://***.com/a/68042877/4510033。

【讨论】:

以上是关于如何禁用通过IP地址直接访问网站的主要内容,如果未能解决你的问题,请参考以下文章

怎样通过IP地址访问网站

如何在 Apache 中禁用直接 ip 访问

用IIS建立的.net网站通过IP地址不能访问解决方法

直接用ip访问网页应该怎样做

如何通过IP地址来访问网站

cdn怎么禁止指定IP访问网站