apache2 namevirtualhost解决错误的网站

运行Apache 2.2.6。 我正在build立一个开发环境。

开发和生产将托pipe在同一台机器上,具有相同的IP地址。

像prod.domain.com和dev.domain.com的DNS条目指向相同的IP。

***重要性:要求dev和prod是完全分开的。 每个将运行它自己的Apache实例。 每个将使用它自己的Apacheconfiguration。

每个prod和dev都将托pipehttp和https。

我有这个build立和工作,但不是像我想的那样限制。

例如,生产configuration:

NameVirtualHost *:80 NameVirtualHost *:443 <VirtualHost *:80 > ServerName prod.domain.com # ... etc </VirtualHost> <VirtualHost *:443 > ServerName prod.domain.com # ... etc </VirtualHost> 

dev站点的设置也是类似的,使用端口8080和4443。

每个网站工作正常。 但假设两个人都在跑步,还可以错误地打“跨地点”。 所以,无意中点击prod.domain.com:8080成功返回从dev站点的页面。 如果这完全失败会好得多。

由于需要两个apacheconfiguration,这对于我来说更难以解决。 如果一个人在一个单一的过程将充分了解的一切。

所以,我试图用蛮力来解决这个问题,包括“其他”网站的虚拟主机,一些会失败的东西,比如没有访问到documentroot。 但是,阿帕奇然后莫名其妙地发现“错误”的虚拟主机。

这是完整的生产configuration,虚拟开发configuration。

 NameVirtualHost *:80 NameVirtualHost *:443 # ---------------------------------------------- # DUMMY HOSTS <VirtualHost *:8080 > ServerName dev.domain.com:8080 DocumentRoot /tmp/ <Directory /tmp/ > Order deny,allow Deny from all </Directory> </VirtualHost> <VirtualHost *:4443 > ServerName dev.domain.com:4443 DocumentRoot /tmp/ <Directory /tmp/ > Order deny,allow Deny from all </Directory> </VirtualHost> # ---------------------------------------------- # REAL PRODUCTION HOSTS <VirtualHost *:80 > ServerName prod.domain.com:80 DocumentRoot /something/valid/ <Directory /something/valid/> Order allow,deny Allow from all </Directory> </VirtualHost> <VirtualHost *:443 > ServerName prod.domain.com:443 DocumentRoot /something/valid/ <Directory /something/valid/> Order allow,deny Allow from all </Directory> # .... other valid ssl setup </VirtualHost> 

这是奇怪的事情。 有了这个configuration,prod.domain.com:80命中成功。 但是一个prod.domain.com:443命中失败,因为它find了dev.domain.com:4443。 我也尝试从ServerName删除端口,但它仍然无法正常工作。

对不起,很长的问题。 希望这是足够的信息。 在此先感谢您的帮助。

对于您不得不使用相同的物理系统进行开发和生产,我表示哀悼。 这听起来很尴尬。 也使testingApache与新的操作系统安装艰难。

在开发服务器上使用的端口没有用NameVirtualHost指定,所以Apache不能使用虚拟主机来匹配它们。 尝试:

 NameVirtualHost *:80 NameVirtualHost *:443 <VirtualHost *:80> ServerName dev.domain.com </VirtualHost> <VirtualHost *:443> ServerName dev.domain.com </VirtualHost> <VirtualHost *:80> ServerName prod.domain.com </VirtualHost> <VirtualHost *:443> ServerName prod.domain.com </VirtualHost> 

要阻止意外的跨站点链接,可以使用mod_rewrite来阻止访问其他服务器。 所以生产服务器将拒绝来自开发服务器(主机名)的访问,反之亦然。 一篇关于mod_rewrite引擎的文章。

否则,请使用外部/现有防火墙或使用netfilter / iptables ACL规则来阻止开发服务器的IP地址,以便来自Internet(或最终用户)的用户无法访问它。

怎么样使用ServerAlias指令,以确保有人不丢弃前缀?