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

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

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

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

SetEnv SPECIAL_PATH /foo/bin

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

Apache - mod_env

Ответ 2

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

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

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

Говорит о SetEnv: "Внутренние переменные среды, заданные этой директивой, устанавливаются после запуска большинства ранних директив обработки запросов, таких как управление доступом и сопоставление URI-к-имени файла. Если переменная среды, которую вы устанавливаете, вход в этот ранний этап обработки, такой как директива 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 (e.g. badQueryString not BadQueryString) */
    $htaccessErrors[] = 'badQueryString:'.getenv("REDIRECT_badQueryString");
}

Я немного покрою в http://lcblog.lernerconsult.com/2013-server-alert-you-file-not-found-errors/