如何禁用通过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 error
的server 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地址直接访问网站的主要内容,如果未能解决你的问题,请参考以下文章