Подтвердить что ты не робот

.htaccess в нескольких средах

Я знаю, что подобные вопросы были заданы раньше, но я не нашел конкретных ответов для моей ситуации.

У меня есть сайт ExpressionEngine, работающий в нескольких средах (локальный, dev, production), и для каждой из этих сред требуются разные правила .htaccess:

Все среды

Разработка

  • Защита паролем с .htpasswd
  • Протокол Force HTTPS
  • Запретить индексирование поисковой системы с помощью X-Robots-Tag

Продукция

  • Протокол Force HTTPS
  • Переадресация недокументов www.

Local

  • Нет уникальных правил.

Я видел много примеров того, как вы можете установить определенные среды для каждого модуля. Как RewriteCond %{REQUEST_HOST} ^dev.myurl.com для модуля mod_rewrite и трюки, подобные этому для требований .htpasswd.

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

var local = 'mysite.local';
var development = 'dev.mysite.com';
var production = 'www.mysite.com';

// Global .htaccess rules

if(environment == local){
   // Local environment .htaccess rules
}

if(environment == development){
   // Development environment .htaccess rules
}

if(environment == production){
   //Production envirotnment .htaccess rules
}

Таким образом, все правила, относящиеся к среде, группируются вместе, создавая действительно чистый файл, и только одна переменная нуждается в изменении при изменении среды.

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

Итак, это задумчивое размышление в стиле "пирог в небе", или это можно сделать?

4b9b3361

Ответ 1

Итак, это задумчивое размышление в стиле "пирог в небе", или это можно сделать?

ИМО, да. Вы никогда не сможете получить предсказуемое "определение областей" правил, основанных на переменных ENV или что-то в этом роде. В apache не существует произвольного if(something) { do everything in here }. Множество директив не будет работать внутри определенных областей, и в дальнейшем, когда вам нужно изменить то, как что-то работает, вы, скорее всего, сломаете то, что у вас есть, чем просто внесите изменения.

Лучший способ - вообще не использовать файлы htaccess:

Вам следует избегать использования файлов .htaccess полностью, если у вас есть доступ к конфигурационному файлу главного сервера httpd. Использование файлов .htaccess замедляет ваш HTTP-сервер Apache. Любая директива, которую вы можете включить в файл .htaccess, лучше устанавливается в блоке Directory, так как она будет иметь тот же эффект с лучшей производительностью.

Создайте отдельный vhost для локального, dev и production. Включите их или отключите по мере необходимости, какую бы глобальную конфигурацию они не использовали, сохраните их в другом месте (например, в файле с именем global.includes), а затем используйте директиву Include во всех 3-х хостах. Если вам нужно применить правила к конкретным каталогам, используйте блок <Directory> вместо файлов htaccess.

Если вы предпочитаете хранить все файлы htaccess, вы можете попробовать поставить все в <IfDefine> блоки, это, вероятно, самое близкое вам "Я буду в вашем псевдокоде в вашем вопросе. По существу что-то вроде:

# Global htaccess rules
RewriteEngine On
RewriteRule ^foo$ /bar [L]

# Only local
<IfDefine LocalInstance>
    RewriteRule ^local/foo /bar [L]
</IfDefine>

# Only dev
<IfDefine DevInstance>
    RewriteRule ^dev/foo /bar [L]
</IfDefine>

# Only production
<IfDefine ProductionInstance>
    RewriteRule ^dev/foo /bar [L]
</IfDefine>

Затем, когда вы запускаете apache, вам нужно передать -DLocalInstance, -DDevInstance или -DProductionInstance в качестве параметров командной строки или с помощью директивы Define (только с одним аргументом) где-нибудь в вашей конфигурации vhost, Это не гарантируется, что вы будете работать так гладко, как кажется, я столкнулся с необъяснимыми проблемами с <IfDefine> раньше, особенно если вы попытаетесь получить слишком фантазию.

Ответ 2

Ответ Джона - хороший. К сожалению, не все веб-хосты позволят вам управлять этим параметром -D для запуска Apache.

Здесь можно использовать один файл htaccess для dev и production, но только защищенный паролем dev:

# ----------------------------------------------------------------------
# Password protect staging server
# Use one .htaccess file across multiple environments
# (e.g. local, dev, staging, production)
# but only password protect a specific environment.
# ----------------------------------------------------------------------

SetEnvIf Host staging.domain.com passreq
AuthType Basic
AuthName "Password Required"
AuthUserFile /full/path/to/.htpasswd
Require valid-user
Order allow,deny
Allow from all
Deny from env=passreq
Satisfy any