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

我正在尝试在.htaccess文件中设置一个环境变量,并在PHP中检索它。我已经在SO上查看了一堆其他线程,但到目前为止,我尝试过的所有方法都失败了。

我已将以下行添加到 .htaccess 文件中:

SetEnv SPECIAL_PATH /foo/bin

我尝试使用getenv()PHP函数检索此值:

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

我已经运行phpinfo()来查看可用环境变量的列表,SPECIAL_PATH不存在。我对为什么这不起作用感到困惑。

谢谢!


答案 1

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

阿帕奇 - mod_env


答案 2

Apache Docs 自定义错误.html涵盖了传递到错误处理页面的环境变量

表示“REDIRECT_环境变量是从重定向之前存在的环境变量创建的。它们使用REDIRECT_前缀重命名,即变为 .HTTP_USER_AGENTREDIRECT_HTTP_USER_AGENT

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

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

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

以下是一些.htaccess设置和使用服务器环境变量的方法,这些方法取自我修改易腐压力5G黑名单/防火墙 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 给出第 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/


推荐