[英]Accessing REMOTE_USER from PHP/CakePHP
我正在開發一個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問題有關? 有什么想法嗎? 我現在在互聯網上發現了很多頁面,這些頁面表明REDIRECT_REMOTE_USER是正常/常見的查找此值的地方,但似乎沒人知道為什么!
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()函數將返回前一個。
這是一般的PHP事情。 一些框架根據其路由策略在內部重定向頁面。 如果您重定向到框架之外,則會得到相同的結果。
直接訪問框架外部的頁面將為您提供最初期望的名稱。 我確實注意到,雖然在CodeIgniter中您獲得了$_SERVER['REMOTE_USER']
且沒有重定向。 因此,這取決於您使用的框架。
因此,如果您不確定是否發生重定向,最好檢查一下兩者。
我還注意到您正在使用AuthVasUseBasic On
。 如果您正在使用它,還應該檢查基本用戶身份驗證變量$_SERVER['USERNAME']
IIRC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.