2009-05-26 29 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