Я работаю над приложением, которое использует перезаписи URL и имеет определенную конфигурацию .htaccess. Когда я работаю над приложением, у меня есть три варианта:
Я постоянно подталкиваю новые обновления к промежуточной и производственной среде, и каждый раз, когда я перезаписываю существующий исходный код, мне нужно внести изменения в файл .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]
Заранее спасибо!
цыпленок
# 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]
Один из вариантов – настроить параметры среды в httpd.conf
(или в другом месте), которые определяют вашу среду.
Например (в httpd.conf
):
SetEnv ENVIRONMENT production
(в .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]
Непроверенный, но я думаю, что эта концепция достаточно звучит, чтобы понять любые проблемы 😉
Можете ли вы не просто разместить файлы .htaccess
в каждой из сред, а затем просто игнорировать файл в любом FTP или программе развертывания, которую вы используете?
Альтернатива, что я делаю, – это настроить VirtualHosts
на моем локальном хосте, который является тем же доменом, что и рабочий сайт, но с dev.
префикс. Например, www.example.com
и dev.example.com
. Таким образом, я всегда могу быть уверен, что корневой каталог верхнего уровня любого хоста, который я использую, независимо от среды; и мне не нужно переписывать мои директивы .htaccess
.
Чак D, вариант Dumitru Ceban очень хорош. Но я предлагаю вам попробовать также вариант наличия некоторого флага в вашем коде – не в .htacces.
Кроме того, хорошее предложение rudi_visser. Но я хочу добавить здесь, что в идеальной системе мы должны использовать apache `.conf и отказываться .htaccess (просто глупое исполнение).
Поэтому я предлагаю вам иметь некоторый флаг в коде, избегайте .htacess (если можно) и переключайте env. простым значением conf или некоторой логикой, например, if locaslhost == host then ...