单独配置文件中的 mod_rewrite 规则(Aegir)

单独配置文件中的 mod_rewrite 规则(Aegir)

我有一个虚拟主机配置文件,我无法直接编辑或修改,因为它是由我们的托管平台生成的,埃吉尔。但它确实有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原始ServerNamevhost 的配置,因此所有 URL 最终都会变成 404,除非它们将流量重定向到外部网站。

而且我不能简单地将DocumentRootServerName添加到 ServerName_redirects.conf 文件中,因为它们是“动态的”,并且当我们在 Aegir 中的服务器或平台之间移动站点时,它们可以随时发生变化。

虽然.htaccessin 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

相关内容