我最近开始学习PHP。我制作了一个基本的网站,并想基本上对其进行密码设置。如果有人能告诉我为什么这不起作用,我将不胜感激。我知道它不起作用,因为我试过了;我就是不明白为什么。
<?php
$user='user';
$pass='pass';
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm='.'hello');
if($_SERVER['PHP_AUTH_USER']==$user && $_SERVER['PHP_AUTH_PW']==$pass)
echo 'Authorized';
else
exit('Exiting');
?>
...
REST OF WEBSITE
...
我知道做这件事的"正确"方法是这样的:
<?php
if(!isset($_SERVER['PHP_AUTH_USER']))
{
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm='.'hello');
exit('Exiting');
}
else
{
$user='user';
$pass='pass';
if($_SERVER['PHP_AUTH_USER']==$user && $_SERVER['PHP_AUTH_PW']==$pass)
echo 'Authorized';
else
{
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm='.'hello');
exit('Exiting');
}
}
?>
REST OF WEBSITE
如果有人至少能给我指明正确的方向,我将不胜感激。
使用HTTP身份验证时,脚本会运行两次:第一次,$_SERVER['PHP_AUTH_USER']
未设置,您必须告诉浏览器页面需要身份验证。然后浏览器重新加载页面,尽管这次$_SERVER['PHP_AUTH_USER']
包含用户名,$_SERVER['PHP_AUTH_PW']
包含用户提供的密码。如果这与正确的凭据($user
和$pass
)匹配,则可以继续将页面发送到浏览器。
您的代码不会区分这两种情况,因此它会告诉浏览器它需要用户名和密码,即使已经发送了正确的凭据。
使用此行:
header('HTTP/1.1 401 Unauthorized');
将通知浏览器请求失败。当您将它用于每个请求时,每个请求都会失败。
这就是为什么在第二个例子中,它并不总是被执行,而只是有条件地执行。
我创建了一个小的演示示例。您的浏览器登录框将显示,您可以输入任何您喜欢的内容,如果您想阻止再显示登录框,请按取消。
然后,您将看到哪些数据被提供给了PHP脚本。