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 方法,取自我修改 Perishable Press 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 给出第一个括号语句的匹配,%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/中进行了深入介绍