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機能するはずです。