如何配置 apache,使其拒绝直接访问 IP 地址的连接(http://xxx.xxx.xxx.xxx)而不是虚拟主机名称http://example.com?
我的VirtualHost配置:
ServerName example.com
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/
<Directory /var/www/>
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
答案1
您无法让它拒绝连接,因为用户尝试用作其 HTTP 主机的主机名(或 IP)在客户端实际发送 HTTP 请求之前是服务器不知道的。TCP 侦听器始终绑定到 IP 地址。
HTTP 错误响应是否可以接受?
<VirtualHost *:80>
ServerName catchall
<Location />
Order allow,deny
Deny from all
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/
<Directory /var/www/>
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
答案2
处理此问题的一个干净的方法是使用 RewriteRule,如下所示
<If "%{HTTP_HOST} == 'x.x.x.x'">
RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>
虽然这确实暴露了与 IP 关联的站点,而不是拒绝访问通过 IP 调用的服务器。但如果这是可以接受的,那就简单又干净了。
答案3
<VirtualHost *:80>
ServerName xxx.xxx.xxx.xxx #your server web server IP
<Location />
Order deny,allow
Deny from all
</Location>
</VirtualHost>
这将禁止通过 IP 访问
答案4
从 Apache 2.5.1 开始,有一个名为的参数StrictHostCheck
。只需打开/etc/apache2.conf
文件并添加以下行:
StrictHostCheck ON
然后重新启动 apache2 服务:
service apache2 restart
ServerName
从现在起,您的网站仅当主机与(中设置的主机匹配时才可访问example.com
,如您的示例所示)。所有其他请求都将被拒绝,代码为 400 Bad Request。