web-dev-qa-db-ja.com

Nginx-リバースプロキシの背後でPHPに対してsslを有効にする方法

私はおおよそこのように見えるセットアップを持っています(これをできるだけ単純化しようとしました):

ポート443-nginxはリッスンしてポート80に転送し、構成は次のようになります

server {
  listen 443 ssl;
  location / {
  proxy_pass http://127.0.0.1:80;
  proxy_set_header X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto https;
  proxy_set_header X-Forwarded-Port 443;
  proxy_set_header Host $Host;
}

ポート80-Varnish(リバースプロキシ)。キャッシュヒットがない限り、ポート8080にトラフィックを転送します。

ポート8080 nginxのセットアップPHP with fastcgi。私はいくつかの一般的な設定を持っています:

location ~ \.php$ {
  ...
  include fastcgi_params;
}

次のようなfastcgi_paramsファイル

...
fastcgi_param   HTTPS           $https if_not_empty;

私がやろうとしていることは、ポート8080でリッスンするときにnginxがコンテンツをhttpまたはhttpsに提供しているかどうかを検出できる設定を作成することです。これはPHP=に指示する必要があるため、正しいスキームでURLを作成できます。

どこかでX-Forwarded-Protoをクリックして、nginxにhttpsがオンになっていることを伝えます。どのように/どこでifステートメントを作成するのか、またはこのようなことが可能であるのか、またはhttpsをオンにする必要があることをnginxに伝える方法がわかりません。

4
googletorp

これは、アプリケーションレベルまたはNginxレベルの2つの方法で解決できます。

アプリケーションレベル

PHPアプリケーションなので、コード/アプリケーションの先頭で以下を使用できます...

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') $_SERVER['HTTPS']='on';

Nginxレベルで

ステップ1:X-Forwarded-Protoを、値がX-Forwarded-Protoに依存する変数にマップします。

map $http_x_forwarded_proto $fastcgi_param_https_variable {
    default '';
    https 'on';
}

ステップ2:既存の行を置き換えるfastcgi_param HTTPS $https $if_not_empty上記の変数に基づいてfastcgi_param HTTPSを設定する次の行

fastcgi_param HTTPS $fastcgi_param_https_variable;

個人的には、物事を正しく設定するために1行だけで済むため、最初の方法を選びます。 2番目の方法も機能するはずですが、テストされていません。

6
Pothi Kalimuthu