【发布时间】:2013-03-20 13:16:43
【问题描述】:
我已经阅读了与此相关的PHP site 中的页面,但我希望访问username 和password,但之前没有指定标题,因此会显示表单并在之后导致某种重新加载。
我希望这个username 和password 传递可以选择性地传递。我的目标是让我的管理用户依赖这些凭据。因此,我不想打开 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 部分被注释掉,我会得到 $user 和 $pass 的 NULL 值。如果我取消注释,我会得到正确的值。
RewriteRule 添加了额外的标头,但对于获取值不是必需的。看起来所有的魔力都在于如果。
【问题讨论】:
-
你尝试过类似
read URL; split by ":". [0] being username.replace("http://", ""); [1] being password.remove("@$")的方法 -
URL在到达目标之前被浏览器解析为简单的
http://example.com,因此不能这样解析。 -
@psyketom 正如预期的那样。客户端的工作是从 URL 中获取这些凭据,将它们组合起来,对它们进行 base64 编码,然后在
Authorization标头中将它们发送到服务器。但是您在$_SERVER['PHP_AUTH_USER']中没有得到任何信息? -
我知道应该将它们打捞到
Auth标头中,但是是的,我在PHP_AUTH_USER中没有得到任何东西,甚至没有设置密钥。 -
@psyketom 你是把 PHP 作为 CGI 运行还是使用 mod_php?
标签: php apache http authentication