【问题标题】:Do I have to duplicate the Virtualhost directives for port 80 and 443?我是否必须为端口 80 和 443 复制 Virtualhost 指令?
【发布时间】:2010-10-15 07:54:21
【问题描述】:

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

我的 包含许多 mod_rewrite 规则、LocationMatch 规则、CGI 指令等。

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

【问题讨论】:

标签: apache virtualhost


【解决方案1】:

你不能使用包含指令来包含通用规则吗? 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>  

【讨论】:

  • 谢谢你;顺便说一句,apache include 指令的 here's an updated version,这是您的答案中第一个链接到的资源
  • 对我来说更简单的解决方案是将 *:80 重命名为 *:443,然后设置一个非常小的 *:80 VirtualHost 来重定向。我意识到这并不能直接回答最初的问题,但如果有兴趣,我很乐意分享我的配置。
【解决方案2】:

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

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

就我而言,我使用过。

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

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

</VirtualHost>

【讨论】:

  • SSLEngine on 似乎在通过http访问网站时也被应用,导致页面出错。
  • 如果你有一个&lt;VirtualHost *:80 *:443&gt; 块,我假设你可以为&lt;VirtualHost *:443&gt; 设置一个单独的块,它只包含 SSL 内容。对吗?
  • @iconoclast 不,你不能有另一个 指令。您可以使用 .... ...
  • @SampathPerera 它确实也为我返回了一条错误消息:“错误请求您的浏览器发送了一个此服务器无法理解的请求。原因:您正在向启用 SSL 的服务器端口发送普通 HTTP . 请改为使用 HTTPS 方案访问此 URL。"
  • ..它实际上在 80 和 443 端口上都使用了 HTTPS,这可以通过在浏览器中使用像 yourhost.yourdomain.com:80 这样的 URL 来证明。
【解决方案3】:

很抱歉冒出这样的旧帖子,但为了帮助其他 Google 员工,我想分享一下我是如何处理它的:

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

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

我做的是这样的:

我创建了目录/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

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

【讨论】:

  • 也采用了这个解决方案。效果很好
【解决方案4】:

另一个不使用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

【讨论】:

  • 很好的答案,但如果有人想知道,这不在 2.2 中。
  • 不,这是 2.4 以后的功能;然而,2.2 于 2017 年 7 月最终发布 EOL,所以现在真的每个人都应该使用 2.4 :)
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 您漏掉了一个至关重要的词。你能补充一下吗?如果你能举个例子,也会有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    相关资源
    最近更新 更多