Назад | Перейти на главную страницу

mod_rewrite правила в отдельном файле конфигурации (Aegir)

У меня есть файл конфигурации виртуального хоста, который я не могу редактировать или изменять напрямую, поскольку он генерируется нашей хостинг-платформой, Эгир. Но у него есть Include pre.d и Include post.d операторы, которые включены до и после vhost-configuration.

Что я хотел бы сделать, так это добавить правила перезаписи для виртуальных хостов в отдельные файлы, чтобы они могли автоматически переноситься при добавлении новых серверов в кластеры.

Так что в 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>

Это лишь одно из многих правил, которые будут использоваться при миграции сайта на новую платформу. Но не работает, пока не заверну в <VirtualHost servername.com:80>-блок. Но поскольку VirtualHost-блоки не наследуются DocumentRoot и ServerName из исходной конфигурации vhost, все URL-адреса в конечном итоге будут иметь значение 404, если только они не перенаправят трафик на внешний сайт.

И я не могу просто добавить DocumentRoot или ServerName в файл ServerName_redirects.conf, поскольку они являются «динамическими» и могут измениться в любой момент времени, когда мы перемещаем сайт между серверами или платформами в Aegir.

Хотя .htaccess в каждом DocumentRoot решит проблему, я тоже не могу использовать это, так как это многосайтовая установка Drupal, и мне пришлось бы поместить правило перезаписи каждого сайта в одно и то же .htaccess файл с RequestCond %{HTTP_HOST} ^www.site-1.com$ для каждого правила, что не особенно элегантно, и я беспокоюсь, как это повлияет на производительность.

Создайте файл [hook] .drush.inc в /var/aegir/.drush/ для хранения функции, которая будет изменять виртуальный хост при его создании. Реализуйте крючок Drush hook_provision_apache_vhost_config($uri, $data) предусмотрено Положением. $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.

Не зная подробностей вашей хостинг-среды, я не могу дать вам однозначного ответа на ваш вопрос. Однако я думаю, что вы можете найти решение своей проблемы на 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, чтобы они соответствовали вашей среде, но подробности для этого находятся в Документы Apache для mod_vhost_alias. Опять же, я надеюсь, что правильно понимаю вашу проблему, и надеюсь, что это поможет!