从PHP/CakePHP访问远程用户
我正在开发一个CakePHP站点,我刚刚使用.htaccess文件为其启用了VAS身份验证:从PHP/CakePHP访问远程用户,php,authentication,cakephp,Php,Authentication,Cakephp,我正在开发一个CakePHP站点,我刚刚使用.htaccess文件为其启用了VAS身份验证: AuthType VAS AuthVasUseBasic On AuthVasRemoteUserMap local Require valid-user 我希望能够通过使用$\u服务器['REMOTE\u USER']找到登录的用户,但我发现$\u服务器结构中缺少密钥:所有这些都是$\u服务器['REDIRECT\u REMOTE\u USER']。事实上,整个结构中充满了前缀为REDIRECT
AuthType VAS
AuthVasUseBasic On
AuthVasRemoteUserMap local
Require valid-user
我希望能够通过使用$\u服务器['REMOTE\u USER']
找到登录的用户,但我发现$\u服务器结构中缺少密钥:所有这些都是$\u服务器['REDIRECT\u REMOTE\u 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的一般问题?知道发生了什么事吗?我现在在互联网上发现了不少页面,这些页面表明重定向\远程\用户作为查找此值的地方是正常/常见的,但似乎没有人知道原因 这是一个通用的PHP东西。一些框架根据其路由策略在内部重定向页面。如果你在一个框架之外重定向,你会得到同样的结果
直接访问框架外的页面将为您提供最初期望的名称。
我确实注意到,在CodeIgniter中,您得到了$\u服务器['REMOTE\u USER']
,并且没有重定向。因此,这取决于您使用的框架
因此,如果您不确定是否发生了重定向,最好检查这两种情况
我还注意到您正在使用authvasuesbasic On
。如果您正在使用它,您还应该检查基本用户身份验证变量$\u SERVER['USERNAME']
IIRCApache正在添加这些重定向前缀,以便脚本能够更好地处理发生的事情。对于我的应用程序,我编写了一个函数来处理这个问题。在我的例子中,它是类上的一个方法,但您可以轻松地将其转换为全局函数
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;
}
}
我在上面编写的getEnv()函数将返回最上面的一个。因为它可能是相关的:我在.htaccess文件中使用mod_rewrite,所有值是否都需要相同,而不管它们包含多少重定向前缀?
$_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