在 Apache 中,当有人仅在 Web 浏览器中使用 IP 地址时,如何禁用对网站的访问?

在 Apache 中,当有人仅在 Web 浏览器中使用 IP 地址时,如何禁用对网站的访问?

我在 CentOS 上使用 apache web 服务器,我需要禁用人们在 web 浏览器中使用服务器的 IP 地址访问网站的功能。我希望当有人尝试浏览 IP 地址时,他们会收到禁止访问的错误消息。

要做到这一点需要什么配置?

答案1

只需设置默认虚拟主机。 中有一个注释示例,httpd.conf或者做一些简单的事情,例如:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot /var/www/html
</VirtualHost>

答案2

您可以使用 mod_rewrite 实现此目的(在文件中.htaccess,或在默认服务器上下文中,或在单独的 VirtualHost 中,其中ServerName是主机的 IP 地址):

RewriteEngine On
RewriteCond %{HTTP_HOST} 1.2.3.4 # Replace with your own IP address
RewriteRule .* - [F]

这表示如果 HTTP_HOST 标头与 IP 地址 1.2.3.4 匹配,则任何请求都应以 来满足403 Forbidden。任何具有其他 HTTP_HOST 标头(例如,具有实际域名而不是 IP 地址的标头)的请求都不应受到影响。

答案3

您无法阻止通过 IP 直接访问。您必须允许连接,然后决定如何处理它。这可能是返回 403、404 或将其重定向到所需页面。您可以使用 mod_rewrite 来执行此操作。

 RewriteEngine On
 RewriteCond %{HTTP_HOST} ^123\.123\.123\.123
 RewriteRule ^(.*)$ - [F,L]

这将与 Web 客户端传递的 HTTP HOST 标头匹配。所有其他请求都将通过。

但是,您可能希望出于 SEO 目的规范化您的 URL。

通过这种方法,您可以重写任何与期望结果不匹配的内容。

RewriteCond %{HTTP_HOST}   !^fully\.qualified\.domain\.name [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/(.*)         http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]

参考:https://httpd.apache.org/docs/2.0/rewrite/rewrite_guide.html#canonicalurl

参考:http://en.wikipedia.org/wiki/URL_normalization

答案4

该解决方案并不涵盖所有情况。

将 IP URL 中的任意数字或点替换为其 %##,例如将 1 替换为 %31...将 8 替换为 %38,您将到达 IP,而不是域名 URL。

假设这个坏IP,用来缓解解释:123.45.6.789

您必须对所有数字和点使用 2 个替代方案:点为 %2E,0..9 为 %30..%39

RewriteEngine on
RewriteCond %{HTTP_HOST} (1|%31)(2|%32)(3|%33)(\.|%2E)(4|%34)(5%35)(\.|%2E)(6|%36)(\.|%2E)(7|%37)(8|%38)(9|%39)
RewriteRule . - [F]

丑陋,它可以用{1,3}减少并限制为有效IP,但由于它适用于您的IP,因此不需要这样做。

不要忘记端口,例如“:80”。HTTP_HOST 包含它,而 SERVER_NAME 不可靠。

相关内容