如何禁用ip地址直接访问网站

Kha*_*d A 32 ip dns nginx cloudflare server

我有一个关于VPS的网站.

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

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

我尝试禁用IP并在云端闪存上发送记录,但它没有用.

我的设置是:

VPS on Linux Debian 
Nginx
no control panel just command line
Cloudflare
DNS setup with BIND
Run Code Online (Sandbox Code Playgroud)

小智 27

你可以使用redirect,nginx配置:

server {
        listen 80;
        server_name IP_ADDRESS;
        return 301 http://YOUR.DOMAIN;
}
Run Code Online (Sandbox Code Playgroud)

  • 此处解决的具体问题是必须使用403等明确定义和重定向或阻止IP地址.我在配置中删除了对我的IP地址的所有引用,它仍然出现在IP上 - 它让我疯了.但是,如果没有覆盖,它似乎会回退到允许IP访问.谢谢! (2认同)
  • 谢谢,这对我有用,但我的应用程序仍然可以使用`IP_ADDRESS:<PORT_NUM>` 访问。我该如何解决? (2认同)

AMB*_*AMB 22

server {
    listen      80 default_server;
    listen      [::]:80 default_server;
    server_name "";
    return      444;
}
Run Code Online (Sandbox Code Playgroud)

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

444:连接没有响应而关闭

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

  • @mahfuz for https,您可以添加监听443 SSL; (2认同)

小智 18

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

server {
    listen 80;
    server_name _;
    return 404;
}
Run Code Online (Sandbox Code Playgroud)

  • @mpen 如果其他之一设置了“default_server”,它将无法工作。`_` 没有特殊含义,你可以使用任何东西。 (2认同)

jar*_*eeq 10

上述两种方法对我的情况都没有帮助 - 与 http 的 IP 连接按预期工作,但 https 重定向到按字母顺序排列的第一个 https 虚拟站点。1.19.4 以下的 nginx 的工作原理是添加空证书来阻止:

server {
  listen 80 default_server;
  listen [::]:80 default_server;
  listen 443 default_server;
  listen [::]:443 default_server;

  ssl_certificate /etc/ssl/null.crt;
  ssl_certificate_key /etc/ssl/null.key;

  server_name "";
  return 444;
}
Run Code Online (Sandbox Code Playgroud)

证书可以用空 CN 生成,因此您无需担心填写它。

openssl req -x509 -newkey rsa:2048 -days 10000 -nodes  -subj '/CN=' -keyout null.key -out null.crt
Run Code Online (Sandbox Code Playgroud)

然后 http/https 返回 444 (ERR_EMPTY_RESPONSE),在不同的配置中,https 返回 ERR_HTTP2_PROTOCOL_ERROR 以及您的空证书,这也可以表明那里什么都没有。

对于 nginx 1.19.4 来说更简单。它介绍了ssl_reject_handshake on | offhttp://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_reject_handshake),您可以将证书“东西”替换为:

server {
  listen 80 default_server;
  listen [::]:80 default_server;
  listen 443 default_server;
  listen [::]:443 default_server;

  ssl_reject_handshake on;

  server_name "";
  return 444;
}
Run Code Online (Sandbox Code Playgroud)

现在您会收到 http 444 (ERR_EMPTY_RESPONSE) 和 https ERR_SSL_UNRECOGNIZED_NAME_ALERT。不需要空证书。

  • 被低估的答案,太棒了,谢谢! (2认同)

小智 6

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

server {
        listen 80;`enter code here`
        server_name IP_ADDRESS;
        return 301 http://YOUR.DOMAIN;
}
Run Code Online (Sandbox Code Playgroud)


use*_*081 2

您可以尝试将服务器IP地址设置为:

/etc/nginx/conf.d/default.conf
Run Code Online (Sandbox Code Playgroud)

所以它看起来像这样:

server {
    listen 80;
    server_name localhost IP.OF.VPS.HERE;
Run Code Online (Sandbox Code Playgroud)

然后您可以指定子域虚拟主机,例如:

server {
        listen 80;
        server_name subdomain.domain.com;
Run Code Online (Sandbox Code Playgroud)

和主域,例如:

server {
        listen 80;
        server_name www.domain.com domain.com;
Run Code Online (Sandbox Code Playgroud)

然后重启Nginx:

/etc/init.d/nginx restart
Run Code Online (Sandbox Code Playgroud)

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

/etc/nginx/conf.d/subdomain.domain.com.conf
/etc/nginx/conf.d/domain.com.conf
/etc/nginx/conf.d/default.conf
Run Code Online (Sandbox Code Playgroud)