我有一个虚拟主机配置文件,我无法直接编辑或修改,因为它是由我们的托管平台生成的,埃吉尔。但它确实有Include pre.d
包含Include post.d
在 vhost-configuration 之前和之后的语句。
我想要做的是在单独的文件中添加特定于 vhost 的重写规则,这样当我们向集群添加新服务器时它们就可以自动迁移。
因此pre.d
我创建了一个名为的文件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>
这只是将网站迁移到新平台期间将使用的众多规则之一。但它不起作用,直到我将其包装在 -block 中<VirtualHost servername.com:80>
。但由于 VirtualHost-blocks 不会继承DocumentRoot
原始ServerName
vhost 的配置,因此所有 URL 最终都会变成 404,除非它们将流量重定向到外部网站。
而且我不能简单地将DocumentRoot
或ServerName
添加到 ServerName_redirects.conf 文件中,因为它们是“动态的”,并且当我们在 Aegir 中的服务器或平台之间移动站点时,它们可以随时发生变化。
虽然.htaccess
in everyDocumentRoot
可以解决问题,但我不能使用它,因为它是一个 Drupal 多站点设置,并且我必须将每个站点的重写规则放在同一个.htaccess
文件中,并使用RequestCond %{HTTP_HOST} ^www.site-1.com$
for each 规则,这不是特别优雅,我担心它会如何影响性能。
答案1
由于不知道您的托管环境的详细信息,我无法给您的问题一个明确的答案。不过,我认为您可能会在 Apache 上找到解决问题的方法大量虚拟主机页面。如果我正确理解了您的问题(我希望如此),您可能能够执行类似以下操作:
<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 行以适合您的环境,但具体操作请参见mod_vhost_alias 的 Apache 文档。再次,我希望我正确理解了您的问题,并且希望这能有所帮助!
答案2
在 /var/aegir/.drush/ 中创建一个 [hook].drush.inc 文件,用于保存在生成 vhost 时更改 vhost 的函数。实现hook_provision_apache_vhost_config($uri, $data)
Provision 提供的 Drush 钩子。 $uri
是正在验证的站点,与 Aegir 中的站点名称相同。您可以返回应注入 vhost 的字符串或字符串数组。Aegir 将在验证站点时调用该钩子。
与下面的示例不同,我通常会返回类似的内容,"Include /etc/apache2/example.com.conf"
以便我可以更改配置而不需要验证站点;我只需重新启动 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。