1. ホーム
  2. php

[解決済み】$_SERVER['HTTPS']を使わずにHTTPSを使用しているかどうかを調べる方法]

2022-04-13 02:06:42

質問

ネット上で多くのチュートリアルを見ましたが、その中で、以下の項目をチェックする必要があると書かれています。 $_SERVER['HTTPS'] サーバーが HTTPS で保護されている場合。私の問題は、私が使用しているいくつかのサーバーで発生しました。 $_SERVER['HTTPS'] が未定義の変数で、エラーになります。常に定義されているはずの他の変数をチェックすることはできますか?

念のため、私は現在、HTTPS接続であるかどうかを解決するためにこのコードを使用しています。

if(isset($_SERVER['HTTPS'])) {
    if ($_SERVER['HTTPS'] == "on") {
        $secure_connection = true;
    }
}

解決方法は?

を指定した場合でも、常に動作するはずです。 $_SERVER['HTTPS'] は未定義です。

function isSecure() {
  return
    (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
    || $_SERVER['SERVER_PORT'] == 443;
}

IISに対応したコードです。

から PHP.netのドキュメントとユーザーのコメント :

<ブロッククオート
  1. スクリプトがHTTPSプロトコルで照会された場合、空でない値に設定されます。

  2. IISでISAPIを使用する場合、リクエストがHTTPSプロトコルを介して行われなかった場合、値は"off"になることに注意してください。(同じ挙動が、Fast-CGI アプリケーションとして PHP を実行している IIS7 でも報告されています)。

また、Apache 1.x サーバー(および壊れたインストール)には $_SERVER['HTTPS'] は、セキュアな接続であっても定義されています。保証されているわけではありませんが、ポート 443 での接続は 規約 を使用している可能性が高いです。 セキュアソケット そのため、ポートチェックが追加されています。

補足:クライアントとサーバーの間にロードバランサーがある場合、このコードはクライアントとロードバランサーの間の接続をテストするのではなく、ロードバランサーとサーバーの間の接続をテストします。前者の接続をテストするには HTTP_X_FORWARDED_PROTO ヘッダがありますが、これはもっと複雑です。 最新コメント この回答の下にあります。