代码之家  ›  专栏  ›  技术社区  ›  scotts

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

  •  56
  • scotts  · 技术社区  · 17 年前

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

    我的<虚拟主机>包含许多mod_重写规则、LocationMatch规则、CGI指令等。

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

    6 回复  |  直到 17 年前
        1
  •  52
  •   sfossen    12 年前

    您不能使用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>  
    
        2
  •  36
  •   Dumindu Perera    13 年前

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

    在我的情况下,我使用了。

    <VirtualHost *:80 *:443>
      ServerName loop.lk
    
     ....
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/local.crt
    
    </VirtualHost>
    
        3
  •  9
  •   reformed Ezequiel García    8 年前

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

    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
    

    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>
    
        4
  •  7
  •   Seb    8 年前

    另一个选项,而不是使用 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
  •  2
  •   Uwe Kleine-König    12 年前

    您可以将公共配置放在一个单独的文件中,并将其包含在两个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
  •  0
  •   Matt Jacob    17 年前

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

    推荐文章