Установите переменную среды в .htaccess и извлеките ее в PHP

Я пытаюсь установить переменную среды в файле .htaccess и получить ее в PHP. Я просмотрел кучу других потоков здесь, но все, что я пробовал до сих пор, не удалось.

Я добавил эту строку в файл .htaccess:

SetEnv SPECIAL_PATH /foo/bin 

Я попытался получить это значение, используя функцию getenv () PHP:

 <?php $specialPath = getenv('SPECIAL_PATH'); ?> 

Я запустил phpinfo (), чтобы увидеть список доступных переменных среды, SPECIAL_PATH не существует. Я недоумеваю, почему это не работает.

Спасибо!

Предполагая, что ваша конфигурация имеет AllowOverrides с .htaccess, вы должны включить mod_env в Apache для этого.

Apache – mod_env

Apache Docs custom-error.html охватывает переменные среды, переданные на страницы обработки ошибок

Говорит, что переменные среды REDIRECT_ создаются из переменных среды, существовавших до перенаправления. Они переименовываются с префиксом REDIRECT_, то есть HTTP_USER_AGENT становится REDIRECT_HTTP_USER_AGENT . "

Говорит: «Ни одно из них не будет установлено, если целью ErrorDocument является внешнее перенаправление (что-либо, начиная с имени схемы, такого как http :, даже если оно относится к тому же хосту, что и сервер)».

Говорит о SetEnv: «Внутренние переменные среды, заданные этой директивой, устанавливаются после запуска большинства ранних директив обработки запросов, таких как управление доступом и сопоставление URI-to-filename. Если переменная среды, которую вы настраиваете, понимается как ввод в эту ранняя фаза обработки, такая как директива RewriteRule, вместо этого вы должны установить переменную среды с помощью SetEnvIf. "

На некоторых серверах пользовательские переменные среды должны начинаться с «HTTP_» для целей безопасности, например: SetEnv HTTP_MY_VARIABLE "my value"

Вот некоторые способы .htaccess установки и использования переменных окружения сервера, взятые из моего изменения скоростного печатного издания 5G Blacklist / Firewall http://perishablepress.com/5g-blacklist-2013/ для использования отчетов об изменениях среды:

 SetEnv myServerName %{SERVER_NAME} RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig|open_basedir) [NC,OR] RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR] RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC] RewriteRule .* - [E=badQueryString:%0--%1--%2,F,L] SetEnvIfNoCase User-Agent ^$ noUserAgent SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) badUserAgent=$1 <limit GET POST PUT> Order Allow,Deny Allow from all Deny from env=badUserAgent </limit> 

Обратите внимание на использование параметров, например $ 0 -% 1 -% 2. % 0 дает полную строку,% 1 дает совпадение с 1-м заключенным в скобки выражением,% 2 – вторым. Дефис являются буквальными символами отображения, чтобы визуально отделять результаты параметров (не думайте, что это способ разместить пробелы там).


Вот некоторые PHP-методы доступа к переменным среды (в моем случае из 403.php и 404.php). Обратите внимание, что вы не смотрите в phpinfo (), а в $ SERVER, и что ваши переменные получают префикс REDIRECT. Также обратите внимание, что с перенаправлением 403/404 QUERY_STRING становится REDIRECT_QUERY_STRING. Это материал, который может быть легко зависимым от сервера. проверьте $ _SERVER за свои фактические значения. Например,

 if (getenv("HTTP_REFERER") !== FALSE) { $httpref = getenv("HTTP_REFERER"); } else { $httpref = ''; } if (isset($_SERVER['REDIRECT_STATUS'])) { $status = $_SERVER['REDIRECT_STATUS']; } else { $status = ''; } if (isset($_SERVER['REMOTE_HOST'])) { $remoteHost = $_SERVER['REMOTE_HOST']; } else { $remoteHost = ''; } if (isset($_SERVER['REDIRECT_QUERY_STRING'])) { $querystring = $_SERVER['REDIRECT_QUERY_STRING']; } else { $querystring = ''; } if (isset($_SERVER['REDIRECT_noUserAgent']) ) { $htaccessErrors[] = 'NoUserAgent'; } if (getenv("REDIRECT_badQueryString") !== FALSE) { /* must exactly match what shows up in $_SERVER, is case sensitive (eg badQueryString not BadQueryString) */ $htaccessErrors[] = 'badQueryString:'.getenv("REDIRECT_badQueryString"); } 

Я подробно расскажу в http://lcblog.lernerconsult.com/2013-server-alert-you-file-not-found-errors/