Apache VHOST:主机与 IP

Apache VHOST:主机与 IP

我有以下 Apache 配置:

ServerName mydomain.com

<VirtualHost 1.2.3.4:80>     # contains my IP
    NameVirtualHost 1.2.3.4   # contains my IP
    ServerName mydomain.com
</VirtualHost>

我的假设是,只有对 mydomain.com 的请求才会发送到该 VirtualHost。不幸的是,即使是对 IP 地址(上述代码中的 1.2.3.4)的请求也由 VHOST 处理。

1)区分IP和主机的正确程序是什么?

2)将请求指向 IP 即 403(即使用单独的 VHOST)的正确方法是什么?

非常感谢!

答案1

我认为没有办法通过改变 vhost defs 来防止这种情况发生。您始终会有一个默认的 vhost。

但是,你可以使用 mod_rewrite 来实现。例如

RewriteEngine on
RewriteCond %{HTTP_HOST}   !^mydomain.com [NC]
RewriteRule ^/(.*) /$1 [F]

当通过 IP 访问服务器时将返回 403(F=forbidden),除非有人很聪明(即在使用 IP 时插入 Host:http 标头;普通浏览器不会这样做)。

您也可以尝试重定向到 mydomain.com,而不是禁止:

RewriteEngine on
RewriteCond %{HTTP_HOST}   !^mydomain.com [NC]
RewriteRule ^/(.*)  http://mydomain.com/$1 [R=301]

答案2

第一个 VirtualHost 是默认的,这就是为什么它也会获取你的 IP 请求。
我会这样做:

NameVirtualHost *:80

<VirtualHost 1.2.3.4:80>  
    ServerName ip.mydomain.com   
    # first VH is default!
</VirtualHost>

<VirtualHost 1.2.3.4:80>
    ServerName mydomain.com
</VirtualHost>

答案3

您现在可以在 faker 答案中保留 NameVirtualHost 指令。当 2 个或更多 VHOST 共享相同地址时,Apache 会自动按服务器名称解析。因此,您可以将其保留下来,以便使用 IP 基础和名称基础 VHOST 的组合。因此,这也将以与 @faker 的上述答案相同的方式工作。

 <VirtualHost 1.2.3.4:80>  
    ServerName ip.mydomain.com   
    # first VH is default!
</VirtualHost>

<VirtualHost 1.2.3.4:80>
    ServerName mydomain.com
</VirtualHost>

相关内容