PHP HTTP身份验证,如果条件语句

时间:2012-11-08 06:52:49

标签: php http authentication

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

1 个答案:

答案 0 :(得分:4)

该脚本运行两次。

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

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

如果您按下escape,浏览器将删除密码对话框,只显示第一次执行时已收到的内容(取消按钮文本)。

您可以通过查看网络服务器的访问日志来执行此操作。