在.htaccess中设置一个环境variables并在PHP中检索它

我试图设置一个.htaccess文件中的环境variables,并在PHP中检索它。 我已经看过了一堆其他的线程,但迄今为止我尝试过的一切都失败了。

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

SetEnv SPECIAL_PATH /foo/bin 

我试图使用getenv()PHP函数检索这个值:

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

我跑了phpinfo()查看可用的环境variables的列表,SPECIAL_PATH不在那里。 我感到困惑,为什么这不起作用。

谢谢!

假设您的配置具有.htaccess的AllowOverrides,您必须在Apache中启用mod_env才能工作。

Apache – mod_env

Apache文档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黑名单/防火墙http://perishablepress.com/5g-blacklist-2013/使用环境变量报告&#xFF1A;

 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给出了来自第一个括号内的语句的匹配,%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/