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

.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

4b9b3361

Ответ 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 ...