読者です 読者をやめる 読者になる 読者になる

オープンソースこねこね

Webプログラミングなどについてあれこれ。

バックエンドのアプリケーションサーバでHTTPSリクエストを判定するための設定

apache nginx PHP

サーバの構成として、軽量なリバースプロキシをフロントに置きバックエンドにPHPなどが動くアプリケーションサーバを配置する構成はよく使われると思います。この場合、リバースプロキシとアプリケーションサーバ間の通信は通常HTTPでおこなわれているので、リバースプロキシがクライアントとHTTPS通信をおこなっていてもバックエンドのアプリケーションではそれがわかりません。

でも、たまにアプリケーションのロジックとしてHTTPSかHTTPかを判断して処理を切り分けたい時などがあります。そんな時は以下のようにフロントのリバースプロキシにHTTPのヘッダ変数の設定をしてやればOKです。

Apacheの場合

<VirtualHost *:443>
  DocumentRoot "/your/documentroot"
  ...
  RequestHeader set X_SSL On
  ...
</VirtualHost>

nginxの場合

server {
  root /your/documentroot;
  ... 
  proxy_set_header    X-SSL           On;
  ...
}

んでアプリケーションサーバで動くPHPでは以下のように判定できる

if ($_SERVER['HTTP_X_SSL'] === 'on') {
  // httpsのときの処理
} else {
  // httpのときの処理
}