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