我已阅读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>';
以下是我正在使用的示例代码。科林建议添加RewriteRule
并不影响结果。
这里的问题是,如果if
部分被注释掉,我会获得$ user和$ pass的NULL
值。如果我取消评论,我会得到正确的价值。
RewriteRule
会添加额外的标头,但对于获取值并非必不可少。看起来所有的魔法都是如此。
答案 0 :(得分: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'];
}
因此,如果您访问http://yourusername:yourpass@yourdomain.com/auth.php,请使用#34; auth.php&#34;中的此代码 您将立即使用URL中提供的用户名和密码进行记录。 如果你直接访问网址如下: http://yourdomain.com/auth.php会出现一个弹出窗口,询问用户名和密码,当您输入时,您将再次登录。使用:
$_SERVER['PHP_AUTH_USER']
$_SERVER['PHP_AUTH_PW']
现在输入用户名和密码。
请记住,当您登录一次后,您的会话仍然存在,并且要测试密码提示框,您需要按&#34; CTRL + SHIFT + N&#34;打开一个新的隐身窗口。然后输入裸URL yourdomain.com/auth.php