我在 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
答案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 不可靠。