我使用PHP documentation中提供的示例#2使用HTTP身份驗證。
我已成功配置腳本,現在可以使用我定義的憑據通過HTTP登錄。但如果在我的MAMP中,我將模式從Identical PHP version for all hosts (module)
切換到Individual PHP version for every host (CGI)
,即使用戶名和密碼正確,腳本也會無限次詢問我是否有正確的用戶名和密碼。HTTP身份驗證不支持CGI
爲什麼會出現這種情況?
我使用PHP documentation中提供的示例#2使用HTTP身份驗證。
我已成功配置腳本,現在可以使用我定義的憑據通過HTTP登錄。但如果在我的MAMP中,我將模式從Identical PHP version for all hosts (module)
切換到Individual PHP version for every host (CGI)
,即使用戶名和密碼正確,腳本也會無限次詢問我是否有正確的用戶名和密碼。HTTP身份驗證不支持CGI
爲什麼會出現這種情況?
在閱讀了幾十頁關於這個問題的文章後,我得出結論認爲沒有解決方法將CGI與HTTP摘要認證結合使用。
但是,如果您能夠使用HTTP基本身份驗證,則有一種解決方法。所以我在服務器API運行CGI的情況下實現了一個異常,並在服務器運行Apache模塊的情況下保存了我的摘要認證。
我遵循@sanderbee提供的link。
這個link也幫了我。
使用預定義的常量PHP_SAPI我已經成功地檢查服務器API運行CGI,如果這是真的,我運行基本HTTP認證:
function admin_digest_auth(){
if (substr(PHP_SAPI, 0, 3) == 'cgi') {
return admin_basic_auth();
}
// You HTTP Digest authentication code ...
}
function admin_basic_auth(){
// split the user/pass parts
if(isset($_SERVER['REDIRECT_HTTP_AUTH']) && !empty($_SERVER['REDIRECT_HTTP_AUTH'])){
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
explode(':' , base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTH'], 6)));
}
// open a user/pass prompt
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
exit('Unauthorized');
// validate submited user/pass
} else {
if($_SERVER['PHP_AUTH_USER'] !== 'admin' ||
$_SERVER['PHP_AUTH_PW'] !== 'mypassword'){
header('HTTP/1.1 401 Unauthorized');
admin_basic_auth();
}
}
return TRUE;
}
而且到最後,你必須添加這條線在你的.htaccess
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTH:%{HTTP:Authorization},L]
發現這個,maby它有幫助嗎? http://www.besthostratings.com/articles/http-auth-php-cgi.html – sanderbee
我以前遇到過類似的問題,它轉向了關於標題的關鍵命名。在CGI模式下,我無法使用** Authorization **發送我的令牌,因爲在服務器端它將是空的。我的解決方法是將密鑰名稱更改爲** CGIAuthorization **。然而,這隻能工作,因爲我有權訪問服務器和客戶端,並可以進行更改。 – Ali
As @sanderbee提到了一些[很好的mod_rewrite解決方法](https://www.google.co.uk/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#q=php%20cgi% 20http%20authentication&es_th = 1)值得一試 – Ali