.htaccess между разработкой, постановкой и производством
Я работаю над приложением, которое использует перезаписи URL и имеет определенную конфигурацию .htaccess. При работе над приложением у меня есть три уровня:
- Разработчик на моей локальной машине (localhost)
- Стадия (staging.mydomain.com)
- Производство (www.mydomain.com)
Я постоянно подталкиваю новые обновления к промежуточной и производственной среде, и каждый раз, когда я перезаписываю существующий исходный код, мне нужно внести изменения в файл .htaccess. Есть ли способ, который я могу использовать .htaccess для каталога или автоматически определить его среду?
Мой текущий файл .htaccess приведен ниже. Я просто не комментирую разделы между разными средами, но хотел бы прекратить это делать...
# Development
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA]
# Staging
# RewriteEngine on
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_URI} !=/favicon.ico
# RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA]
# Production
# RewriteEngine on
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_URI} !=/favicon.ico
# RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA]
Спасибо заранее!
Chuck
Ответы
Ответ 1
# Development
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteCond %{HTTP_HOST} ^localhost
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA]
# Staging
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteCond %{HTTP_HOST} ^staging.mydomain.com
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA]
# Production
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteCond %{HTTP_HOST} ^www.mydomain.com
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA]
Ответ 2
Один из вариантов - настроить переменные среды в httpd.conf
(или в другом месте), которые определяют вашу среду.
Например (в httpd.conf
):
SetEnv ENVIRONMENT production
(in .htaccess
)
RewriteEngine on
# Development
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} != /favicon.ico
RewriteCond %{ENV:ENVIRONMENT} = development
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA]
# Staging
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} != /favicon.ico
RewriteCond %{ENV:ENVIRONMENT} = staging
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA]
# Production
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} != /favicon.ico
RewriteCond %{ENV:ENVIRONMENT} = production
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA]
Непроверенный, но я думаю, что эта концепция достаточно звучит, чтобы выяснить какие-либо проблемы; -)
Ответ 3
Не можете ли вы разместить свои файлы .htaccess
в каждой из сред, а затем просто проигнорировать файл в любом FTP или программе развертывания, которую вы используете?
Альтернативно, что я делаю, настроен VirtualHosts
на моем локальном хосте, который является тем же доменом, что и производственный сайт, но с префиксом dev.
. Например, www.example.com
и dev.example.com
. Таким образом, я всегда могу быть уверен, что корневой каталог верхнего уровня любого хоста, который я использую, независимо от среды; и мне не нужно переписывать мои директивы .htaccess
.
Ответ 4
Чак D, вариант Dumitru Ceban очень хорош. Но я предлагаю вам попробовать также вариант наличия некоторого флага в вашем коде - не в .htacces.
Кроме того, хорошее предложение rudi_visser. Но я хочу добавить здесь, что в идеальной системе мы должны использовать apache `.conf и отказываться .htaccess(просто глупое исполнение).
Поэтому я предлагаю вам иметь некоторый флаг в коде, избегать .htacess(если можно) и переключать env. простым значением conf или некоторой логикой, например if locaslhost == host then ...