0
<?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 语句以及控制结构的其余部分。为什么是这样?

4

1 回答 1

4

该脚本运行两次。

首先,它进入第一个块,将标题和“如果用户点击取消按钮则发送的文本”文本发送到浏览器,然后停止(参见 参考资料exit)。PHP 脚本完全终止,忘记了曾经发生过的任何事情。

控制权交给浏览器,您可以在其中输入密码。(此时,浏览器已经收到取消按钮文本,但由于 401 状态标头而无法显示。)输入密码后,控件返回服务器并再次从top,现在(发送密码)进入第二部分。

如果您按转义键,浏览器将删除密码对话框,并仅显示它在第一次执行期间已收到的内容(取消按钮文本)。

您可以通过查看您的网络服务器的访问日志来遵循这一点。

于 2012-11-08T07:19:02.673 回答