<?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;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>
这段代码违背了“if”控制结构工作方式背后的逻辑。但是我在很多代码中都看到了同样的东西,所以出于某种原因,它必须是正确的。然而,我的逻辑告诉了我。
当然"!isset($_SERVER['PHP_AUTH_USER']))
的条件检查是否在服务器上设置了此变量。让我们说它没有设定。因此,服务器向需要HTTP身份验证"header('WWW-Authenticate: Basic realm="My Realm"');"
的客户端发送请求,并假设我提供了一个正确的请求。在此之后,"if"
控制结构以某种方式跳过" header('HTTP/1.0 401 Unauthorized');"
和echo语句以及控制结构的其余部分。这是为什么?
答案 0 :(得分:4)
该脚本运行两次。
首先进入第一个块,将标题和“如果用户点击取消按钮发送文本”文本发送到浏览器,然后停止(参见exit
)。 PHP脚本完全终止并忘记发生过任何事情。
将控件传递给浏览器,您可以在其中输入密码。 (此时,浏览器已经收到取消按钮文本,但由于401状态标题而无法显示它。)输入密码后,控件返回服务器并再次执行脚本从顶部,现在(发送密码)它会进入第二部分。
如果您按下escape,浏览器将删除密码对话框,只显示第一次执行时已收到的内容(取消按钮文本)。
您可以通过查看网络服务器的访问日志来执行此操作。