Hallo,
Der Quelltext ist original aus dem Buch. Wenn ich es aber auf meiner Website teste, kann ich den Benutzernamen und -passwort so oft eingeben wie ich will. Immer wieder erscheint die Eingabeaufforderung.
Wenn Du PHP als FastCGI oder CGI mit dem Apache-Webserver betreibst, dann funktioniert das nicht, weil der Apache-Server den Authorization-Header nicht an PHP durchreicht.
Beide FastCGI-Module für den Apache bieten an, dies manuell noch nachträglich zu tun, beide machen das aber auf die gleiche Weise falsch (mod_fcgid wird es aber ab 2.3.6 aber richtig machen), weswegen das auch bei PHP nicht richtig ankommt.
Zur Konfiguration:
Wenn mod_fastcgi verwendet wird: Dann kann man in der zentralen Serverkonfiguration (.htaccess geht da leider nicht!) folgendes eintragen:
FastCgiConfig -pass-header Authorization
Wenn mod_fcgid verwendet wird, dann kann man in der zentralen Serverkonfiguration (.htaccess geht auch hier nicht) folgendes eintragen:
alt (bis mod_fcgid 2.2): PassHeader Authorization
neu (ab mod_fcgid 2.3): FcgidPassHeader Authorization
Wenn diese Konfiguration aktiviert ist (und *NUR* dann), dann kannst Du folgenden Code an den Anfang Deines PHP-Scripts tun, der diese Informationen dann extrahiert:
/* PHP_AUTH_USER/PHP_AUTH_PW setzen wenn mod_fastcgi/mod_fcgid mit passheader verwendet wird */
if (isset($_SERVER['Authorization'])) {
$auth = preg_split('/\s+/', trim($_SERVER['Authorization']));
if (strtolower($auth[0]) == 'basic' && count($auth) >= 2) {
$data = explode(":", base64_decode($auth[1]));
if (count($data) >= 2) {
$_SERVER['PHP_AUTH_USER'] = array_shift($data);
$_SERVER['PHP_AUTH_PW'] = join(':', $data);
}
}
}
Wenn Du keine Möglichkeit hast, die zentrale Serverkonfiguration zu ändern, dann nützt Dir der obige PHP-Code natürlich nichts (außer Dein Hoster hat sie zufälligerweise schon "richtig" gesetzt). Wenn PHP als CGI und nicht als FastCGI läuft, kannst Du auch nichts ändern und kannst ebenso keine HTTP-Authentifizierung nutzen.
(Alternativ kann man natürlich den kompletten Apache-Server mit einem speziellen Compilerflag kompilieren, welches Apache auch bei CGI/FastCGI den Authorization-Header durchreichen lässt. Aber das wäre ein noch gravierenderer Eingriff, als bloß die Serverkonfiguration zu ändern.)
(Weitere Alternativen sind natürlich die Verwendung von PHP als CGI/FastCGI iVm. einem anderen Webserver wie lighttpd oder nginx odre die Verwendung des Apache-Moduls mod_php, um PHP einzubinden.)
Viele Grüße,
Christian
Mein "Weblog" [RSS]
Using XSLT to create JSON output (Saxon-B 9.0 for Java)
How to tell the difference between a science fan and a scientist.