Автоматическое определение внутренней / внешней среды разработки

Мы используем следующую функцию для автоматического обнаружения, если мы находимся на машине внутри или на реальном сервере, а затем выбираем соответствующие конфигурации для различных компонентов:

function devIsLocal(){ $res=false; $http_host=$_SERVER['HTTP_HOST']; if($http_host=='localhost')$res=true; if($http_host=='127.0.0.1')$res=true; if(substr($http_host,-4)=='.lan')$res=true; if(strpos($http_host, '.')===false)$res=true; return($res); } 

Как вы видите, это зависит только от значения HTTP_HOST.

Конечно, если вы используете какой-то виртуальный хост локально, например example.com, тогда функция будет обманута.

Есть ли другие способы обмануть эту функцию? и какие другие переменные / места мы могли бы заглянуть, чтобы определить, где мы находимся?

 '127.0.0.1' == $_SERVER["REMOTE_ADDR"] 

Это никогда не будет оцениваться как TRUE на вашей живой системе. 🙂

Установите переменную среды в настройке виртуального хоста Apache. Это делает Zend Framework.

См. Руководство по быстрому запуску ZF для примера (раздел «Создание виртуального хоста»).

В файле httpd.conf или .htaccess добавьте:

 SetEnv APPLICATION_ENV "development" 

Затем в вашем приложении используйте функцию getenv для получения значения:

 $environment = getenv("APPLICATION_ENV"); if ($environment == "development") { // do development stuff } else if ($environment == "live") { // do live stuff } 

Добавление к ответу Энди Шеллама ..

Если вы используете mod_vhost_alias или имеете разные домены с тем же (виртуальным) корнем документа, вы можете установить переменную, зависящую от параметров, например

 SetEnvIf SERVER_ADDR xxxx APPLICATION_ENV=development SetEnvIf HTTP_HOST abc.example.com APPLICATION_ENV=development 

Создайте и в дальнейшем найдите файл, который существует только в файловой системе live сервера.

Разумеется, ваши условия должны быть как можно более похожими; я предлагаю что-то вроде этого: в каталоге / var / environment / есть файл с именем {devel | test | qa | staging | live}, в зависимости от сервера, на котором вы находитесь, – тогда просто проверьте имя файла.

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

Конечно, если вы используете виртуальный хост локально, например example.com, тогда функция будет обманута.

Также, если хост не является локальным, но использует widlcard или default vhost defn, и пользователь добавляет IP-адрес в файл hosts локально.

Я бы порекомендовал иметь каталог на пути include, который также существует в режиме реального времени, но не реплицируется там – и просто сохраняет:

 function getEnv(){ return 'Live'; } 

или

 function getEnv(){ return 'Test'; } 

Если оба envs находятся на одном сервере, вы все равно можете сделать это, установив include_path в конфигурацию Apache или .htaccess.

Это также позволяет отделить потенциально чувствительные специфические данные env – такие как хосты / пароли базы данных и ключи шифрования.

C.