2009-05-26 46 views
0

我正在开发一个CakePHP的网站,我一直在使用.htaccess文件刚启用VAS认证:从PHP/CakePHP的访问REMOTE_USER

AuthType VAS 

AuthVasUseBasic On 
AuthVasRemoteUserMap local 

Require valid-user 

我希望能够找出谁是通过使用$_SERVER['REMOTE_USER']登录,但我发现从$_SERVER结构中缺少密钥:所有这些都是$_SERVER['REDIRECT_REMOTE_USER']。事实上,整个结构是充满键与REDIRECT_前缀:

echo var_dump($_SERVER); 
array(52) { 
["REDIRECT_REDIRECT_REDIRECT_SCRIPT_URL"]=> string(37) "/cake_1_2/feedbacks/edit/6" 
["REDIRECT_REDIRECT_REDIRECT_SCRIPT_URI"]=> string(55) "http://test/cake_1_2/feedbacks/edit/6" 
["REDIRECT_REDIRECT_REDIRECT_STATUS"]=> string(3) "200" 
["REDIRECT_REDIRECT_SCRIPT_URL"]=> string(37) "/cake_1_2/feedbacks/edit/6" 
["REDIRECT_REDIRECT_SCRIPT_URI"]=> string(55) "http://test/cake_1_2/feedbacks/edit/6" 
["REDIRECT_REDIRECT_STATUS"]=> string(3) "200" 
["REDIRECT_SCRIPT_URL"]=> string(37) "/cake_1_2/feedbacks/edit/6" 
["REDIRECT_SCRIPT_URI"]=> string(55) "http://test/cake_1_2/feedbacks/edit/6" 
["REDIRECT_HANDLER"]=> string(8) "php5-cgi" 
["REDIRECT_STATUS"]=> string(3) "200" 
["SCRIPT_URL"]=> string(37) ... 
["REDIRECT_REMOTE_USER"]=> string(9) "andygeers" 
... 
} 

我不能完全肯定这是怎么回事!这是在POST请求中产生的第一件事,它不会对这个特定请求进行重定向。

这是与CakePHP,还是只是一个普遍的PHP问题?任何想法发生了什么?我在互联网上发现了不少页面,其中暗示REDIRECT_REMOTE_USER是正常/常见的地方,可以找到此值,但似乎没有人知道为什么!

+0

因为它可能是相关的:我在.htaccess文件中使用mod_rewrite以及 – andygeers 2009-05-26 11:41:34

回答

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()函数将返回最上面的一个。

+0

无论它们包含多少个`REDIRECT_`前缀,是否所有的值都保持相同? – andygeers 2009-05-27 08:33:54

1

这是一个普通的PHP事情。一些框架根据其路由策略在内部重定向页面。如果你在框架之外重定向,你会得到相同的结果。

直接访问框架外部的页面会为您提供最初预期的名称。 虽然CodeIgniter中我注意到你得到了$_SERVER['REMOTE_USER']并且没有重定向。所以它依赖于你使用的框架。

因此,如果您不确定是否存在重定向,最好检查两者。

我还注意到你正在使用AuthVasUseBasic On。如果你正在使用它,你还应该检查基本的用户认证变量$_SERVER['USERNAME'] IIRC