Apache - 仅监听特定域,而不是 IP

Apache - 仅监听特定域,而不是 IP

如何配置 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。

您可以在这里找到有关 StrictHostCheck 的更多文档

相关内容