2

我已经阅读了与此相关的PHP 站点中的页面,但我希望访问usernameand password,但之前没有指定标题,因此会显示表单并在之后导致某种类型的重新加载。

我希望这个usernamepassword传递可以可选地传递。我的目标是让我的管理用户依赖这些凭据。因此,与其打开example.com/admin登录然后重定向回example.com显示管理功能,我想读取这些凭据并从中登录(如果它们匹配)。

我已经var_dump'ed$_SERVER$_ENV,但要求http://username:password@example.com不要在任何地方显示它们。

我将 PHP 作为 CGI 运行。

我该怎么做?

更新:

<?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;
}*/

echo '<pre>';

$user = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : null;
$pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : null;
var_dump( $user, $pass );

var_dump($_SERVER, $_ENV);

echo '</pre>';

这是我正在使用的示例代码。Colin 的添加建议RewriteRule并没有影响结果。

这里的问题是,如果该if部分被注释掉,我会得到NULL$user 和 $pass 的值。如果我取消评论它,我会得到正确的值。

添加额外的RewriteRule标题,但不是获取值所必需的。看起来所有的魔力都在于如果。

4

1 回答 1

1

我认为这正是您正在寻找的:

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 '<pre>';
    print_r ($_SERVER); 
    echo '</pre>';
    echo '<hr>';
    echo 'Username: ' . $_SERVER['PHP_AUTH_USER'];
    echo '<br>Pass: ' . $_SERVER['PHP_AUTH_PW'];
}

因此,在您的“auth.php”中使用此代码,如果您访问http://yourusername:yourpass@yourdomain.com/auth.php 您将立即使用您的用户名登录并在 URL 中提供密码。如果您直接访问 url,例如:http: //yourdomain.com/auth.php会出现一个弹出窗口询问用户名和密码,当您输入它们时,您将再次登录。使用:

$_SERVER['PHP_AUTH_USER']
$_SERVER['PHP_AUTH_PW']

现在获取输入的用户名和密码。

请记住,当您登录一次时,您的会话仍然存在,要测试密码提示框,您需要按“CTRL + SHIFT + N”打开一个新的隐身窗口,然后输入裸 URL yourdomain.com/auth.php

于 2015-07-11T12:36:44.690 回答