在.htaccess中设置环境变量并在PHP中检索它

在.htaccess中设置环境变量并在PHP中检索它,php,apache,.htaccess,environment-variables,Php,Apache,.htaccess,Environment Variables,我试图在.htaccess文件中设置一个环境变量,并在PHP中检索它。我在这里已经浏览了很多其他的帖子,但是到目前为止我所尝试的一切都失败了 我已将这一行添加到.htaccess文件中: SetEnv SPECIAL_PATH /foo/bin 我已尝试使用getenv()PHP函数检索此值: <?php $specialPath = getenv('SPECIAL_PATH'); ?> 我运行了phpinfo()来查看可用环境变量的列表,但没有特殊的路径。我不明白这为什么不

我试图在.htaccess文件中设置一个环境变量,并在PHP中检索它。我在这里已经浏览了很多其他的帖子,但是到目前为止我所尝试的一切都失败了

我已将这一行添加到.htaccess文件中:

SetEnv SPECIAL_PATH /foo/bin
我已尝试使用getenv()PHP函数检索此值:

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

我运行了phpinfo()来查看可用环境变量的列表,但没有特殊的路径。我不明白这为什么不起作用


谢谢大家!

假设您的配置允许使用.htaccess进行覆盖,则必须在Apache中启用mod_env才能使其工作


Apache Docs custom-error.html包含传递到错误处理页面的环境变量

表示“重定向\环境变量是从重定向之前存在的环境变量创建的。它们用重定向\前缀重命名,即,
HTTP\u USER\u AGENT
变为
REDIRECT\u HTTP\u USER\u AGENT

表示“如果ErrorDocument目标是外部重定向(任何以方案名称(如http:)开头的内容,即使它引用的是与服务器相同的主机),则不会设置这些内容。”

关于SetEnv:“此指令设置的内部环境变量是在运行大多数早期请求处理指令后设置的,例如访问控制和URI到文件名的映射。如果要设置的环境变量是作为早期处理阶段(如RewriteRule指令)的输入,则应改为使用SetEnvIf设置环境变量。”

在某些服务器上,出于安全目的,用户声明的环境变量必须以“HTTP_”开头,例如:
SetEnv HTTP_MY_变量“MY value”

以下是一些.htaccess设置和使用服务器环境变量的方法,摘自我修改易腐Press 5G黑名单/防火墙以使用环境变量报告的文章:

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>

我将在

中深入介绍您确定为该特定目录启用了htaccess文件吗?请尝试另一个效果易于验证的指令。这个问题对您有帮助吗?我猜这就是问题所在。我正在尝试找出如何启用Apache模块(我对任何与服务器相关的内容都是新手),但至少我现在知道该去哪里找了。非常感谢。无论您的httpd.conf位于何处,默认情况下通常是“conf/httpd.conf”--查找行
\LoadModule env_module modules/mod_env.so
并删除#,然后重新启动apache。
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");
}