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

Apache 我是否必须复制端口80和443的Virtualhost指令?,apache,virtualhost,Apache,Virtualhost,我有一个冗长而复杂的指令列表,我必须将它们复制到端口80和443的单独组中,因为我使用的是SSL。每当我更新mod_重写规则时,我必须记住在两个地方都要更新,否则我会破坏我的应用程序。。。这是自找麻烦。有没有一种方法可以组合或别名这些文件?两者之间的唯一区别是端口443版本包含SSLEngine、SSLCertificateFile等文件 My包含许多mod_重写规则、LocationMatch规则、CGI指令等 另外,我不能使用.htaccess文件。您不能使用include指令来包含公共规则

我有一个冗长而复杂的指令列表,我必须将它们复制到端口80和443的单独组中,因为我使用的是SSL。每当我更新mod_重写规则时,我必须记住在两个地方都要更新,否则我会破坏我的应用程序。。。这是自找麻烦。有没有一种方法可以组合或别名这些文件?两者之间的唯一区别是端口443版本包含SSLEngine、SSLCertificateFile等文件

My包含许多mod_重写规则、LocationMatch规则、CGI指令等


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

您不能使用include指令来包含公共规则吗

例如:


...
包括conf/common_rule.conf
...
包括conf/common_rule.conf
... #SSL规则
包括conf/common_rule.conf

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

包括conf/common.conf
包括conf/common.conf
(将您的特定于ssl的配置内容放在此处…)

您还可以在容器中而不是在容器本身中指定公共指令。这就是我所做的,主要是因为我更喜欢在目录级别而不是服务器级别的mod#u重写规则,但它也应该同样适用于您。

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

<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> 
。。。
在我的情况下,我使用了

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

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

</VirtualHost>

ServerName loop.lk
....
斯伦金安
SSLCertificateFile/etc/apache2/ssl/local.crt

很抱歉碰到这样一篇老帖子,但为了帮助其他谷歌用户,我想与大家分享一下我是如何处理它的:

我的本地主机上有几个虚拟主机,比如:
localhost
foo.com
bar.com

这是我笔记本电脑(macosx)上的本地主机站点,我可以使用自签名证书,因此ssl部分对于所有vHost都是相同的

我所做的是:

我创建了目录
/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
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
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
SSLEngine on
SSLCertificateFile "/etc/apache2/ssl/server.crt"
SSLCertificateKeyFile "/etc/apache2/ssl/server.key"
<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>
A
/etc/apache2/extra/vhosts/bar.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
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
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
SSLEngine on
SSLCertificateFile "/etc/apache2/ssl/server.crt"
SSLCertificateKeyFile "/etc/apache2/ssl/server.key"
<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>
在我的
/etc/apache2/extra/httpd vhosts.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
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
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
SSLEngine on
SSLCertificateFile "/etc/apache2/ssl/server.crt"
SSLCertificateKeyFile "/etc/apache2/ssl/server.key"
<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>

Include/etc/apache2/extra/vhosts/localhost.conf
Include/etc/apache2/extra/vhosts/localhost.conf
Include/etc/apache2/extra/vhosts/ssl.conf
Include/etc/apache2/extra/vhosts/foo.conf
Include/etc/apache2/extra/vhosts/foo.conf
Include/etc/apache2/extra/vhosts/ssl.conf
Include/etc/apache2/extra/vhosts/bar.conf
Include/etc/apache2/extra/vhosts/bar.conf
Include/etc/apache2/extra/vhosts/ssl.conf

另一个替代使用
Include
的选项是使用
Macro
(因此您可以将所有内容保存在一个文件中)

首先启用宏模块:

a2enmod macro
然后将共享内容放入宏中,并从虚拟主机中使用它:

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

ServerName example.com
服务器管理员example@example.com
...
使用SharedStuff
使用SharedStuff
斯伦金安
SSLProtocol All-SSLv2-SSLv3
...
宏也可以采用参数,并在包含的其他文件中定义;因此,您可以像使用函数一样使用它们,并在Apache配置文件中保存大量重复

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


即使通过http访问站点,似乎也会应用SSLEngine on的副本,从而导致错误页面。如果您有
块,我假设您可以为
创建一个单独的块,该块仅包含SSL内容。是吗?@iconoclast不,你不能再有其他指令了。你可以用。。。。或者@SampathPerera它也为我返回了一条错误消息:“请求错误您的浏览器发送了一个此服务器无法理解的请求。原因:您正在对启用SSL的服务器端口使用纯HTTP。请改用HTTPS方案访问此URL。”…事实上,它在80和443端口上都使用HTTPS,这可以通过在你的浏览器中使用类似URL的方式来证明。你遗漏了一个至关重要的词。你能补充一下吗?如果你能举个例子也会很有帮助;顺便说一句,apache
include
指令是您回答中第一个链接到资源的指令。对我来说,一个更简单的解决方案是将*:80重命名为*:443,然后设置一个非常小的*:80虚拟主机重定向。我意识到这并不能直接回答最初的问题,但如果有兴趣的话,我很乐意分享我的配置。我也同意这个解决方案。很好的回答,但这不是在2.2中,以防有人想知道。不,这是一个2.4以后的功能;然而,2.2在2017年7月最终发布时已经下线,所以现在每个人都应该使用2.4了:)