2015-06-22 160 views
1

我使用PHP documentation中提供的示例#2使用HTTP身份驗證。
我已成功配置腳本,現在可以使用我定義的憑據通過HTTP登錄。但如果在我的MAMP中,我將模式從Identical PHP version for all hosts (module)切換到Individual PHP version for every host (CGI),即使用戶名和密碼正確,腳本也會無限次詢問我是否有正確的用戶名和密碼。HTTP身份驗證不支持CGI

enter image description here

爲什麼會出現這種情況?

+1

發現這個,maby它有幫助嗎? http://www.besthostratings.com/articles/http-auth-php-cgi.html – sanderbee

+0

我以前遇到過類似的問題,它轉向了關於標題的關鍵命名。在CGI模式下,我無法使用** Authorization **發送我的令牌,因爲在服務器端它將是空的。我的解決方法是將密鑰名稱更改爲** CGIAuthorization **。然而,這隻能工作,因爲我有權訪問服務器和客戶端,並可以進行更改。 – Ali

+0

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

回答

0

在閱讀了幾十頁關於這個問題的文章後,我得出結論認爲沒有解決方法將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]