我有一个虚拟主机configuration文件,我不能直接编辑或修改,因为它是由我们的主机平台Aegir生成的。 但是,它具有Include pre.d和Include post.d语句,这些语句包含在vhostconfiguration之前和之后。
我想要做的是在独立文件中添加特定于虚拟主机的重写规则,以便在向群集添加新服务器时自动迁移。
所以在pre.d我创build了一个名为ServerName_redirects.conf的文件,其中我放置了以下内容:
<VirtualHost *:80> RewriteEngine on RewriteCond %{HTTPS} !=on RewriteCond %{HTTP_HOST} ^servername.com$ [NC] RewriteRule ^/*(.*)$ https://servername.com%{REQUEST_URI} [L,R=301] </VirtualHost>
这只是网站迁移到新平台期间将要使用的许多规则之一。 但它不起作用,直到我把它包装在一个<VirtualHost servername.com:80> – 块。 但是由于VirtualHost-blocks并没有从原始虚拟主机的configuration中inheritanceDocumentRoot和ServerName ,所有的URL最终都会以404结尾,除非它们将stream量redirect到外部站点。
我不能简单地将DocumentRoot或ServerName添加到ServerName_redirects.conf文件,因为这些文件是“dynamic的”,并且可以随时在Aegir中的服务器或平台之间移动站点时进行更改。
尽pipe每个DocumentRoot的.htaccess都能解决这个问题,但是我不能使用它,因为它是一个Drupal多站点设置,而且我将不得不将每个站点的重写规则放在与RequestCond %{HTTP_HOST} ^www.site-1.com$相同的.htaccess文件中。 RequestCond %{HTTP_HOST} ^www.site-1.com$为每个规则,这不是特别优雅,我担心如何影响性能。
不知道你的托pipe环境的细节,我不能给你一个明确的答案你的问题。 不过,我想你可能会在Apache的大量虚拟主机页面上find你的问题的解决scheme。 如果我正确地理解了你的问题,而且我希望是,那么你也许可以做类似的事情:
<VirtualHost *:80> RewriteEngine on RewriteCond %{HTTPS} !=on RewriteRule ^/*(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] VirtualDocumentRoot /www/hosts/%0/docs VirtualScriptAlias /www/hosts/%0/cgi-bin </VirtualHost>
你必须调整你的VirtualDocumentRoot和VirtualScriptAlias行来适应你的环境,但是这样做的细节在Apache文档mod_vhost_alias中 。 再次,我希望我正确理解你的问题,我希望这有助于!
在/var/aegir/.drush/中创build一个[hook] .drush.inc文件来保存一个函数,该函数在生成时会改变虚拟主机。 实现Provision提供的Drush hook hook_provision_apache_vhost_config($uri, $data) 。 $uri是正在validation的网站,与Aegir中的网站名称相同。 您可以返回应该注入到虚拟主机的string或string数组。 Aegir将在validation一个站点时调用该钩子。
与我下面的例子不同,我通常会返回类似"Include /etc/apache2/example.com.conf"这样我就可以在不需要validation站点的情况下更改configuration; 我可以重新启动Apache。
/** * Implements hook_provision_apache_vhost_config(). * * Insert custom vhost configurations into Aegir's template. */ function example_provision_apache_vhost_config($uri, $data) { if ($uri == 'example.com') { return " RewriteEngine on RewriteCond %{HTTP:X-Forwarded-Proto} ^http$ RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] "; } }
请参阅http://docs.aegirproject.org/en/3.x/extend/altering-behaviours/#injecting-into-site-vhosts 。