我们有一个运行Apache HTTP服务器的前向Linux框,它充当了几个后端服务器的反向代理。 服务器通过特定的域名和端口进行访问,并在Apache中作为虚拟主机进行设置:
Listen 8001 Listen 8002 <Virtualhost *:8001> ServerName service.one.mycompany.com ProxyPass / http://internal.one.mycompany.com:8001/ ProxyPassReverse / http://internal.one.mycompany.com:8001/ RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] </Virtualhost> <Virtualhost *:8002> ServerName service.two.mycompany.com ProxyPass / http://internal.two.mycompany.com:8002/ ProxyPassReverse / http://internal.two.mycompany.com:8002/ RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] </Virtualhost>
代理服务器只有一个IP地址,两个域都指向它。 通过service.one访问internal.one可以正常工作,就像通过service.two访问internal.two一样。
现在的问题是Apache访问虚拟主机时不考虑请求域。 我的意思是这两个域都适用于两个端口:service.one:8002代理服务器对internal.two:8002的请求,以及service.two:8001代理服务器对internal.one:8001的请求,理想情况下这两个请求都应该是否认。
我可以通过创build更多显式拒绝这些请求的虚拟主机来解决这个问题:
NameVirtualHost *:8001 NameVirtualHost *:8002 <Virtualhost *:8001> ServerName service.two.mycompany.com Redirect permanent / http://errorpage.mycompany.com/ </Virtualhost> <Virtualhost *:8002> ServerName service.one.mycompany.com Redirect permanent / http://errorpage.mycompany.com/ </Virtualhost>
但是这不是一个理想的解决scheme,因为我们打算向代理添加更多的服务,并且每个新端口都需要在所有其他域上被明确拒绝,并且每个新域都需要在所有端口被明确拒绝不利用。 随着我们添加更多的服务,虚拟主机的数量可能会很快失去控制。
那么我的问题是,是否有更好的办法呢? 我们是否可以将特定端口与虚拟主机中的特定域绑定,以便仅处理该域 – 端口组合,而其他所有组合都不是?
我试过的东西:
代理服务器运行CentOS 6.2 64位,Apache HTTPD服务器2.2.15。 如前所述,代理服务器只有一个IP地址,我们使用的所有域都指向它。
Apache总是希望给定端口的默认回退,这就是你现在看到的。 所以,即使servername不匹配,这是它的最后/唯一的手段。 这就是为什么有一个000默认的通用作为标准。
您可以在vhostconfiguration中使用mod_rewrite来显式阻止/redirect任何不匹配的域。
RewriteCond %{SERVER_NAME} !my.domain.com RewriteRule (.*)$ http://my.domain.com$1 [L,R=301]