代码之家  ›  专栏  ›  技术社区  ›  andygeers

从php/cakephp访问远程用户

  •  1
  • andygeers  · 技术社区  · 16 年前

    我正在开发一个cakephp站点,我刚刚使用.htaccess文件启用了VAS身份验证:

    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问题?你知道怎么回事吗?我已经在互联网上找到了相当多的网页,建议重定向远程用户是一个正常/常见的地方来找到这个值,但似乎没有人知道为什么!

    2 回复  |  直到 13 年前
        1
  •  2
  •   Sander Marechal    16 年前

    Apache正在添加这些重定向前缀,以便脚本能够更好地处理所发生的事情。对于我的应用程序,我编写了一个函数来处理这个问题。在我的例子中,它是一个类上的方法,但是您可以很容易地将它转换成一个全局函数。

    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;
        }
    }
    

    编辑: 上面的函数返回具有最多重定向前缀的变量的内容,这通常是您想要的。如果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()函数将返回顶部的函数。

        2
  •  1
  •   agf    13 年前

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

    直接访问框架外的页面将为您提供最初预期的名称。 我确实注意到了,尽管在“代码点火器”中 $_SERVER['REMOTE_USER'] 没有重定向。所以它取决于您使用的框架。

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

    我也注意到你在使用 AuthVasUseBasic On . 如果您正在使用它,您还应该检查基本用户身份验证变量 $_SERVER['USERNAME'] 国际刑事法庭