Я пытаюсь передать переменную окружения от .htaccess до PHP. Это отлично работает на моем локальном сервере WAMP, но на сервере, где размещен мой веб-сайт, он безрезультатен.
Вот моя тестовая конфигурация:
.htaccess:
SetEnv TEST_VARIABLE test_value
test.php:
<pre> getenv('TEST_VARIABLE') = <?php print getenv('TEST_VARIABLE'); ?> getenv('REDIRECT_TEST_VARIABLE') = <?php print getenv('REDIRECT_TEST_VARIABLE'); ?> </pre>
На моем локальном сервере правильное возвращение test.php:
getenv('TEST_VARIABLE') = test_value getenv('REDIRECT_TEST_VARIABLE') =
Но на сервере производства он возвращает:
getenv('TEST_VARIABLE') = getenv('REDIRECT_TEST_VARIABLE') =
Вещи, которые я исключал:
mod_env
не установлен / включен хостом. Не может быть, потому что тогда SetEnv
не будет распознан, и я получаю 500 при обработке .htaccess.
AllowOverrides
в httpd.conf
для этого каталога не включает FileInfo
. Не может быть, потому что тогда Apache выбрал бы ошибку «SetEnv не разрешен здесь» при встрече с директивой SetEnv
и я снова получу 500.
variables_order
в php.ini не включает 'E'. Это объясняет, что $_ENV
пусто (оно есть), но не почему getenv()
не возвращает значения для этих переменных.
Вся окружающая среда прикручена. Не может быть, потому что getenv('PATH')
и getenv('SERVER_NAME')
возвращают действительные значения.
На данный момент я не понимаю, какая конфигурация может быть причиной этого.
Я не думаю, что использование setenv обычно работает в .htaccess. Это команда сценария оболочки (bash, C shell и т. Д.). Если ваш сервер поддерживает setenv, в соответствии с https://kb.mediatemple.net/questions/36/Using+Environment+Variables+in+PHP#gs вам нужно, чтобы имя переменной начиналось с HTTP_.
Если вы используете домашний сервер на Mac или имеете suEXEC, есть меры безопасности, чтобы удалить любые переменные среды, отличные от HTTP, которые не определены, поэтому они не будут отображаться в $ _ENV ['APPLICATION_ENV']. Вы можете, однако, обращаться к ним через собственную PHP-функцию, чтобы получить то же самое.
$var = apache_getenv('APPLICATION_ENV');
Эта функция получит любую переменную среды, определенную с помощью SetEnv в вашем файле .htaccess, или любую переменную среды, заданную в php.ini, даже если PHP удалит их из переменной $ _ENV.
Затем вы можете определить переменную окружения в PHP, если хотите, хотя и не рекомендуется.
$_ENV['APPLICATION_ENV'] = apache_getenv('APPLICATION_ENV');
Или лучшее решение: просто определите глобальное:
define('APPLICATION_ENV', apache_getenv('APPLICATION_ENV'));
Как только вы это сделаете, он должен работать по своему желанию.