我正在开发一个CakePHP网站,我刚刚使用.htaccess文件启用了VAS身份验证:
AuthType VAS
AuthVasUseBasic On
AuthVasRemoteUserMap local
Require valid-user
我希望能够通过使用$_SERVER['REMOTE_USER']
找出登录的用户,但我发现$_SERVER
结构中缺少密钥:所有这些都有{{{ 1}}。事实上,整个结构充满了$_SERVER['REDIRECT_REMOTE_USER']
前缀:
REDIRECT_
我不确定发生了什么!这是在POST请求中首先生成的,并且它没有对此特定请求进行重定向。
这与CakePHP有关,还是只是一般的PHP问题?有什么想法发生了什么?我现在在互联网上发现了不少页面,这表明REDIRECT_REMOTE_USER是正常/常见的,可以找到这个值,但似乎没有人知道为什么!
答案 0 :(得分:2)
Apache正在添加那些REDIRECT_前缀,以便脚本可以更好地处理发生的事情。对于我的应用程序,我已经写了一个函数来处理这个问题。在我的例子中,它是一个类的方法,但你可以很容易地把它变成一个全局函数。
class MyClass {
/** @var integer How deep the redirect layers of Apache go. -1 means not set. */
private $redirectLevel = -1;
/**
* Get an environment variable with all the REDIRECT_ prefixes stripped off
*/
private function getEnv($var)
{
// Find out how deep the redirect goes
if ($this->redirectLevel == -1) {
reset($_SERVER);
$key = key($_SERVER);
$this->redirectLevel = substr_count($key, 'REDIRECT_');
}
$result = '';
$prefix = '';
for ($i = 0; $i < $this->redirectLevel + 1; $i++) {
if (isset($_SERVER[$prefix . $var])) {
$result = $_SERVER[$prefix . $var];
}
$prefix .= 'REDIRECT_';
}
return $result;
}
}
编辑:上面的函数返回REDIRECT_前缀最多的变量的内容,这通常是你想要的。如果Apache不为变量添加前缀,那么这就是你得到的。变量的内容可以根据前缀的数量而改变。毕竟,Apache添加了前缀,因此它不会覆盖旧值。
例如,在我的网站上,我使用mod_ssl通过客户端SSL证书进行客户端身份验证。证书主题(包含用户的电子邮件地址)存储在SSL_CLIENT_S_DN变量中。使用Apache前缀,这将显示为:
$_SERVER['REDIRECT_REDIRECT_SSL_CLIENT_S_DN'] // string containing the subject
$_SERVER['REDIRECT_SSL_CLIENT_S_DN'] // exists, but empty
// $_SERVER['SSL_CLIENT_S_DN'] does not exist
我上面写的getEnv()函数将返回顶部函数。
答案 1 :(得分:1)
这是一般的PHP事情。某些框架根据其路由策略在内部重定向页面。如果您在框架之外重定向,您将获得相同的结果。
直接访问框架之外的页面将为您提供最初预期的名称。
我注意到虽然在CodeIgniter中你得到$_SERVER['REMOTE_USER']
并且没有重定向。因此,它取决于您使用的框架。
因此,如果您不确定是否发生重定向,最好检查两者。
我还注意到您正在使用AuthVasUseBasic On
。如果您正在使用此功能,还应检查基本用户身份验证变量$_SERVER['USERNAME']
IIRC