【问题标题】:Set an environment variable in .htaccess and retrieve it in PHP在 .htaccess 中设置环境变量并在 PHP 中检索它
【发布时间】:2013-07-07 04:15:45
【问题描述】:

我正在尝试在 .htaccess 文件中设置环境变量并在 PHP 中检索它。我在 SO 上查看了许多其他线程,但到目前为止我尝试的一切都失败了。

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

SetEnv SPECIAL_PATH /foo/bin

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

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

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

谢谢!

【问题讨论】:

标签: php apache .htaccess environment-variables


【解决方案1】:

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

Apache - mod_env

【讨论】:

  • 我猜这就是问题所在。我正试图弄清楚如何启用 Apache 模块(我是一个与服务器相关的任何东西的新手),但至少我现在知道在哪里看。非常感谢。
  • 无论你的 httpd.conf 位于何处,默认情况下通常是“conf/httpd.conf”——查找行 #LoadModule env_module modules/mod_env.so 并删除 #,然后重新启动 apache。
【解决方案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设置和使用服务器环境变量的方法,取自我修改Perishable Press 5G Blacklist/Firewall http://perishablepress.com/5g-blacklist-2013/ to use environment variable reporting:

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/ 中进行了一些深入的介绍

【讨论】:

    猜你喜欢
    • 2017-05-10
    • 2012-03-26
    • 2014-11-26
    • 2019-07-31
    • 2011-05-17
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多