9

我尝试通过 http 实现一个小型身份验证,并从网上复制了这段代码,以检查这是否能正常工作:

<?php
    if(!isset($_SERVER['PHP_AUTH_USER'])) {
        header('WWW-Authenticate: Basic realm="My Realm"');
        header('HTTP/1.0 401 Unauthorized');
        echo 'Text to send if user hits Cancel button';
        exit;
    } else {
        echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
        echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
    }
?>

但是,我的浏览器总是要求输入用户名和密码,但在我取消之前从不输出任何内容。因此,我认为这$_SERVER['PHP_AUTH_USER']永远不会设置!可能是什么问题?我正在运行带有Apache/2.0.63 (Unix) mod_ssl/2.0.63 OpenSSL/0.9.7d DAV/2 Server.

4

3 回答 3

22

对于 PHP-CGI:

在 .htaccess 添加这个:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</IfModule>

并在脚本的开头添加以下内容:

list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
于 2014-03-21T08:48:24.047 回答
21

运行 phpinfo()。如果“服务器 API”是 CGI/FCGI,你几乎可以忘记它,因为没有明智的方法来使用 PHP 的 HTTP 身份验证。

于 2011-08-13T21:13:27.250 回答
0

启用 PHP-FPM,它将开始工作。

$valid_passwords = array ("test" => "test");
$valid_users = array_keys($valid_passwords);

$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];

$validated = (in_array($user, $valid_users)) && ($pass == $valid_passwords[$user]);

if (!$validated) {
    header('WWW-Authenticate: Basic realm="Test"');
    header('HTTP/1.0 401 Unauthorized');
    die ("Not authorized");
}
于 2019-09-19T08:56:40.273 回答