Apache 我是否必须复制端口80和443的Virtualhost指令?
我有一个冗长而复杂的指令列表,我必须将它们复制到端口80和443的单独组中,因为我使用的是SSL。每当我更新mod_重写规则时,我必须记住在两个地方都要更新,否则我会破坏我的应用程序。。。这是自找麻烦。有没有一种方法可以组合或别名这些文件?两者之间的唯一区别是端口443版本包含SSLEngine、SSLCertificateFile等文件 My包含许多mod_重写规则、LocationMatch规则、CGI指令等Apache 我是否必须复制端口80和443的Virtualhost指令?,apache,virtualhost,Apache,Virtualhost,我有一个冗长而复杂的指令列表,我必须将它们复制到端口80和443的单独组中,因为我使用的是SSL。每当我更新mod_重写规则时,我必须记住在两个地方都要更新,否则我会破坏我的应用程序。。。这是自找麻烦。有没有一种方法可以组合或别名这些文件?两者之间的唯一区别是端口443版本包含SSLEngine、SSLCertificateFile等文件 My包含许多mod_重写规则、LocationMatch规则、CGI指令等 另外,我不能使用.htaccess文件。您不能使用include指令来包含公共规则
另外,我不能使用.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的方式来证明。你遗漏了一个至关重要的词。你能补充一下吗?如果你能举个例子也会很有帮助;顺便说一句,apacheinclude
指令是您回答中第一个链接到资源的指令。对我来说,一个更简单的解决方案是将*:80重命名为*:443,然后设置一个非常小的*:80虚拟主机重定向。我意识到这并不能直接回答最初的问题,但如果有兴趣的话,我很乐意分享我的配置。我也同意这个解决方案。很好的回答,但这不是在2.2中,以防有人想知道。不,这是一个2.4以后的功能;然而,2.2在2017年7月最终发布时已经下线,所以现在每个人都应该使用2.4了:)