質問編集履歴

1 タイトルが一覧でエスケープされていたので修正

tomoeine

tomoeine score 122

2016/08/30 13:53  投稿

リバースプロキシ経由のHTTPS接続で、PHPの$_['HTTPS']をonにしたい
リバースプロキシ経由のHTTPS接続で、環境変数「HTTPS」をonにしたい
###前提・実現したいこと
nginxを利用したリバースプロキシ経由で、HTTPSとHTTPが混合したサイトを実現しようとしています。
リクエストがHTTPSの場合、
- クライアント→リバースプロキシ(nginx):https
- リバースプロキシ→バックエンド(Apache):http
で接続させようとしています。
###発生している問題・エラーメッセージ
PHP側では、フレームワーク(CodeIgniter)のコア部分で各種URLを動的に生成しており、$_SERVER['HTTPS']がonならば「https://~」に、空またはoffの場合は「http://~」が吐かれます。
リバースプロキシを使用すると、HTTPSでアクセスした場合にも「http://~」が吐かれてしまいます。
ユーザーの遷移先がHTTPに変わってしまうだけでなく、formのaction先がHTTPSでないため、Mixed Contentで安全でないページとブラウザに評価されてしまいます。
原因は、**環境変数「HTTPS」が空**になっていることのようです。
リバースプロキシ経由でもこの環境変数をonに設定できれば解決できるのでは・・・と思って試行錯誤しましたが、うまくいきません。
###該当のソースコード
リバースプロキシ側
nginx.confのSSL部分の設定
```conf
server {
listen 443;
server_name subdomain.hogehoge.com;
ssl on;
ssl_certificate 証明書のパス;
ssl_certificate_key 秘密鍵のパス;
location / {
proxy_pass http://バックエンドのプライベートIP;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect http:// https://;
}
}
```
バックエンド側
httpd.confのバーチャルホスト設定
```conf
<VirtualHost *:80>
ServerAdmin admin@hogehoge.com
DocumentRoot 公開ディレクトリのパス
ServerName subdomain.hogehoge.com
<Directory "公開ディレクトリのパス">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
```
PHP
CodeIgniter Config.php
```php
$base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
```
###試したこと
上記の通り、nginx.conf内に、「proxy_set_header」でSSLに関連しそうな設定は一通り行いました。
また、PHPのURL生成で「https://~」を生成する条件に`$_SERVER['HTTP_X_FORWARDED_SSL' == on`を加えてみたところ、期待した動作は実現しました。が、フレームワークのコア部分なのでできれば手を加えずに実現したいです。
###補足情報(言語/FW/ツール等のバージョンなど)
PHPのフレームワークはCodeIgniterです。
  • PHP

    31224 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Apache

    2629 questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • nginx

    1419 questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • CodeIgniter

    312 questions

    CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る