我最近开始学习HTML和PHP。如果有人能指出我正确的方向,我会很感激:我已经制作了一个基本的网页,其中包含基本的身份验证(输入它)。当用户点击取消按钮时,我希望浏览器做点什么!它所做的就是,保留在它所在的页面上(在用户尝试访问我的页面之前)。我想我希望它显示401错误。是这样做的唯一方法,在以下后插入文本:
header('www-authenticate: basic');
我已经尝试重定向.htaccess文件中的401错误,虽然看起来401错误永远不会发生(尽管服务器访问日志表明存在401错误)。当我使用.htaccess重定向我的404错误时,它工作正常。
这是我用于身份验证的代码:
<?php
$user = array('Michael' => 'Mike');
$pass = array('Michael' => 'fish');
$userSuccess = false;
$passSuccess = false;
if(!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['PHP_AUTH_PW']))
{
header('http/1.1 401 Unauthorized');
header('www-authenticate: basic');
exit;
}
else
{
foreach($user as $value)
if($_SERVER['PHP_AUTH_USER'] == $value)
$userSuccess = true;
foreach($pass as $value)
if($_SERVER['PHP_AUTH_PW'] == $value)
$passSuccess = true;
if(!$userSuccess || !$passSuccess)
{
header('http/1.1 401 Unauthorized');
header('www-authenticate: basic');
exit;
}
}
?>
另外,如果我在代码中做了任何愚蠢的事情,请随意指出。
我认为自从我将401标头发送到服务器,并且服务器已经收到它后,它会显示一些文字说'错误401:未经授权的访问'或者其他类似的内容。
感谢。
答案 0 :(得分:1)
您需要使用401的内容为浏览器提供服务。这不是自动完成的。您发送的401标头从未真正被用户看到。将其视为状态标志而不是内容。程序使用该标题来检测某些问题并对其进行操作(即下载管理器可以检测404标题,然后在其窗口中显示带有红色背景和错误符号的下载行。)
总之,您需要自己将错误打印到浏览器
答案 1 :(得分:1)
你走的是正确的方式。我会对您的代码进行一些更改:
$user = array('Mike' => array('Michael', 'fish'));
if(!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['PHP_AUTH_PW']))
{
header('http/1.1 401 Unauthorized');
header('www-authenticate: basic');
exit;
}
else
{
$input_user = $_SERVER['PHP_AUTH_USER'];
$input_pw = $_SERVER['PHP_AUTH_PW'];
if($user[$input_user][1] != $input_pw)
{
header('http/1.1 401 Unauthorized');
header('www-authenticate: basic');
exit;
}
}
echo "Hi, " . $user[$input_user][0];
首先,我已将此布局上的users
数组布局更改为:
Array
(
[Mike] => Array
(
[0] => Michael
[1] => fish
)
)
阅读更多信息Multidimensional Arrays。
Secund,是您的username
,然后它会有另一个用户name
和password
的数组。因此,您无需使用foreach
来匹配您的用户名并通过。顺便说一句,你在脚本允许任何用户访问其他用户之前所采用的方式是通过的。如果您有其他用户foo
并尝试user = foo
和pass = fish
,则会获得访问权限。
第三件事是你不需要再使用$userSuccess
和$passSuccess
。只是为了减少代码长度。
然后我将两个变量与_SERVER
变量相关联,以方便它们的使用。所以你可以用这句话来匹配:$user[$input_user][1] != $input_pw
。
我希望这可以帮助你。