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"');"私が正しいものを提供したとしましょう。この後、どういうわけか、制御構造は、および echo ステートメントと制御構造の残りの部分を"if"スキップします。" header('HTTP/1.0 401 Unauthorized');"どうしてこれなの?

4

1 に答える 1

4

スクリプトは 2 回実行されます。

最初に最初のブロックに入り、ヘッダーと「ユーザーが [キャンセル] ボタンを押した場合に送信するテキスト」テキストをブラウザーに送信し、停止します ( を参照exit)。PHP スクリプトは完全に終了し、何かが起こったことを忘れます。

コントロールはブラウザーに渡され、そこでパスワードを入力します。(この時点で、ブラウザーは既にキャンセル ボタンのテキストを受信して​​いますが、401 ステータス ヘッダーのために表示されません。) パスワードを入力すると、制御がサーバーに戻り、スクリプトがサーバーから再度実行されます。 top、そして今(パスワードが送信されている)、2番目の部分に実行されます。

代わりにエスケープを押すと、ブラウザーはパスワード ダイアログを削除し、最初の実行中に既に受け取ったもの (キャンセル ボタンのテキスト) を表示するだけです。

これは、Web サーバーのアクセス ログを調べることで確認できます。

于 2012-11-08T07:19:02.673 に答える