我必须复制端口80和443的虚拟主机指令吗?

我有一个<VirtualHost>指令的复杂列表,我必须将它们复制到端口80和443的单独<VirtualHost>组中,因为我使用的是SSL。 每当我更新我的mod_rewrite规则,我必须记住在两个地方做,否则我会打破我的应用程序…这个重复是要求麻烦。 有没有一种方法来组合或别名这两者之间的唯一区别是端口443版本包含SSLEngine,SSLCertificateFile等。

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

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

你不能使用include指令来包含通用规则。 这里

文章

例如。:

<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> 

您可以在单个Virtualhost指令中使用任意数量的主机和端口。

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

在我的情况下,我用了。

 <VirtualHost *:80 *:443> ServerName loop.lk .... SSLEngine on SSLCertificateFile /etc/apache2/ssl/local.crt </VirtualHost> 

对不起,碰到这样一个旧的职位,但为了帮助其他谷歌在那里我想分享我如何处理它:

我在本地主机上有几个虚拟主机,说:localhost,foo.com,bar.com

这是我的笔记本电脑(macosx)本地主机网站,我可以摆脱自签名证书,因此ssl的一部分是相同的所有vhosts …

我做的是这样的:

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

我创build了一个/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 

/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 

一个/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> 

您可以将通用configuration放入单独的文件中,并将其包含在两个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> 

您也可以在容器中指定通用指令,而不是在指令本身内。 这就是我所做的,主要是因为我更喜欢目录级别的mod_rewrite规则,而不是在服务器级别,但它也适用于您。