Sinatra がリダイレクトに使用される URL を正しく組み立てるためには、要求が ssl を使用しているかどうかを判断できる必要がありhttp
ますhttps
。
明らかに、thin への実際の呼び出しは ssl を使用していません。これはフロント エンド Web サーバーによって処理されており、プロキシされた要求は平文です。したがって、実際には SSL を使用していなくても、要求を安全なものとして扱うように Sinatra に伝える方法が必要です。
最終的に、リクエストを安全なものとして扱うかどうかを決定するコードは、 メソッドRack::Request#ssl?
とRack::Request#scheme
メソッドにあります。scheme
メソッドは、env
ハッシュを調べて、多数のエントリのいずれかが存在するかどうかを確認します。これらの 1 つは、 HTTP ヘッダーHTTP_X_FORWARDED_PROTO
に対応するものです。X-Forwarded-Proto
これが設定されている場合、値はプロトコル スキーム (http
またはhttps
) として使用されます。
したがって、nginx からバックエンドにプロキシされるときに、この HTTP ヘッダーをリクエストに追加すると、Sinatra はいつリダイレクトするかを正しく判断できhttps
ます。nginx では、プロキシされたリクエストにヘッダーを追加できます。proxy_set_header
スキームは$scheme
変数で利用できます。
したがって、行を追加します
proxy_set_header X-Forwarded-Proto $scheme;
行の後にnginx構成に追加すると、proxy_pass
機能するはずです。