我是否必须复制端口80和443的Virtualhost指令?

时间:2009-03-24 21:44:18

标签: apache virtualhost

我有一个冗长而复杂的< VirtualHost>列表指令,我必须将它们复制到单独的< VirtualHost>端口80和443的组,因为我正在使用SSL。每当我更新我的mod_rewrite规则时,我必须记住在两个地方都这样做,否则我会破坏我的应用程序...这个重复是在寻找麻烦。有没有办法将这些组合或别名 - 两者之间的唯一区别是端口443版本包含SSLEngine,SSLCertificateFile等。

我的< Virtualhost>包含许多mod_rewrite规则,LocationMatch规则,CGI指令等

另外,我不能使用.htaccess文件。

6 个答案:

答案 0 :(得分:47)

您不能使用include指令来包含通用规则。 here

article

例如:

<VirtualHost _default_:80>
    ...
    include conf/common_rule.conf
</VirtualHost>

<VirtualHost _default_:*>
    ...
    include conf/common_rule.conf
</VirtualHost> 

<VirtualHost _default_:443>
    ... #SSL rules
    include conf/common_rule.conf
</VirtualHost>  

答案 1 :(得分:33)

您可以在单个Virtualhost指令中使用任何#个主机和端口。

<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> 

在我的情况下,我用过。

<VirtualHost *:80 *:443>
  ServerName loop.lk

 ....
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/local.crt

</VirtualHost>

答案 2 :(得分:8)

很抱歉找到这样的旧帖子,但是为了帮助其他Google员工,我想分享我处理它的方式:

我的本​​地主机上有几个虚拟主机,例如:localhostfoo.combar.com

这是我笔记本电脑上的本地主机站点(macosx)我可以使用自签名证书,因此所有虚拟机的ssl-part都是相同的......

我做的是:

我创建了目录/etc/apache2/extra/vhosts/

我创建了/etc/apache2/extra/vhosts/localhost.conf

ServerName localhost
DocumentRoot "/www/localhost"
<Directory /www/localhost>
  Require all granted
</Directory>
ErrorLog "/var/log/apache2/localhost.error_log"
CustomLog "/var/log/apache2/localhost.access_log" common

A /etc/apache2/extra/vhosts/foo.conf

ServerName foo.com
DocumentRoot "/www/foo.com"
<Directory /www/foo.com>
  Require all granted
</Directory>
ErrorLog "/var/log/apache2/foo.com.error_log"
CustomLog "/var/log/apache2/foo.com.access_log" common

A /etc/apache2/extra/vhosts/bar.conf

ServerName bar.com
DocumentRoot "/www/bar.com"
<Directory /www/bar.com>
  Require all granted
</Directory>
ErrorLog "/var/log/apache2/bar.com.error_log"
CustomLog "/var/log/apache2/bar.com.access_log" common

最后是/etc/apache2/extra/vhosts/ssl.conf

SSLEngine on
SSLCertificateFile "/etc/apache2/ssl/server.crt"
SSLCertificateKeyFile "/etc/apache2/ssl/server.key"

在我的/etc/apache2/extra/httpd-vhosts.conf

<VirtualHost *:80>
  Include /etc/apache2/extra/vhosts/localhost.conf
</VirtualHost>
<VirtualHost *:443>
  Include /etc/apache2/extra/vhosts/localhost.conf
  Include /etc/apache2/extra/vhosts/ssl.conf
</VirtualHost>

<VirtualHost *:80>
  Include /etc/apache2/extra/vhosts/foo.conf
</VirtualHost>
<VirtualHost *:443>
  Include /etc/apache2/extra/vhosts/foo.conf
  Include /etc/apache2/extra/vhosts/ssl.conf
</VirtualHost>

<VirtualHost *:80>
  Include /etc/apache2/extra/vhosts/bar.conf
</VirtualHost>
<VirtualHost *:443>
  Include /etc/apache2/extra/vhosts/bar.conf
  Include /etc/apache2/extra/vhosts/ssl.conf
</VirtualHost>

答案 3 :(得分:2)

您可以将公共配置放入单独的文件中,并将其包含在两个VirtualHost段中。例如:

<VirtualHost 192.168.1.2:80>
  Include conf/common.conf
</VirtualHost>

<VirtualHost 192.168.1.2:443>
  Include conf/common.conf
  (put your ssl specific cofiguration stuff here ...)
</VirtualHost>

答案 4 :(得分:1)

使用Include代替使用Macro的另一种选择(因此您可以将它们全部保存在一个文件中)。

首先启用宏模块:

a2enmod macro

然后将共享的内容放到宏中,并从虚拟主机中use

<Macro SharedStuff>
   ServerName example.com
   ServerAdmin example@example.com
   <DocumentRoot /var/www/example>
      ...
   </DocumentRoot>
</Macro>

<VirtualHost *:80>
  Use SharedStuff
</VirtualHost>

<VirtualHost *:443>
  Use SharedStuff

  SSLEngine On
  SSLProtocol All -SSLv2 -SSLv3
  ...
</VirtualHost>

宏还可以采用参数,并且可以在包含的其他文件中定义;因此您可以像使用函数一样使用它们,并在您的Apache配置文件中保存大量重复项。

有关更多详细信息,请参见此处:

https://httpd.apache.org/docs/2.4/mod/mod_macro.html

答案 5 :(得分:0)

您还可以在容器内而不是在自身内指定公共指令。这就是我的工作,主要是因为我更喜欢目录级而不是服务器级别的mod_rewrite规则,但它也应该同样适用于你。