私はおおよそこのように見えるセットアップを持っています(これをできるだけ単純化しようとしました):
ポート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に伝える方法がわかりません。
これは、アプリケーションレベルまたはNginxレベルの2つの方法で解決できます。
PHPアプリケーションなので、コード/アプリケーションの先頭で以下を使用できます...
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') $_SERVER['HTTPS']='on';
ステップ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番目の方法も機能するはずですが、テストされていません。