nginx で Sinatra が https を http にリダイレクトする問題を修正する方法
質問
私はnginxで実行されているSinatraアプリを持っています(シンをバックプロキシとして使用)。 redirect '/<path>'
シナトラでの発言。ただし、https でサイトにアクセスすると、リダイレクトによって次の場所に送信されます。 http://localhost/<path>
ではなく https://localhost/<path>
彼らがすべきように。
現在、nginx はこのコマンドで制御を Thin に渡します。 proxy_pass http://薄い_cluster
, 、 どこ thin_cluster
は
upstream thin_cluster { server unix:/tmp/thin.cct.0.sock; }
これを修正するにはどうすればよいですか?
解決
Sinatra がリダイレクトに使用される URL を正しく組み立てるためには、リクエストが ssl を使用しているかどうかを判断できる必要があります。これにより、次を使用してリダイレクトを行うことができます。 http
または https
適切に。
明らかに、thin への実際の呼び出しは ssl を使用していません。これはフロントエンド Web サーバーによって処理され、プロキシされた要求は平文で行われるためです。したがって、実際には ssl を使用していない場合でも、リクエストを安全なものとして扱うべきであることを Sinatra に伝える方法が必要です。
最終的に、リクエストを安全なものとして扱うべきかどうかを決定するコードは、 Rack::Request#ssl?
そして Rack::Request#scheme
方法。の scheme
メソッドは、 env
ハッシュを使用して、多数のエントリのうちの 1 つが存在するかどうかを確認します。そのうちの 1 つは、 HTTP_X_FORWARDED_PROTO
に対応する X-Forwarded-Proto
HTTPヘッダー。これが設定されている場合、値はプロトコル スキームとして使用されます (http
または https
).
したがって、nginx からバックエンドにプロキシされるときにこの HTTP ヘッダーをリクエストに追加すると、Sinatra はいつリダイレクトするかを正しく判断できるようになります。 https
. 。nginx では、プロキシされたリクエストにヘッダーを追加できます。 proxy_set_header
, 、スキームはで利用可能です $scheme
変数.
したがって、行を追加すると、
proxy_set_header X-Forwarded-Proto $scheme;
後のnginx設定に proxy_pass
lineで機能するはずです。
他のヒント
すべてのリンクをnginxレイヤーのhttpsに強制的に移動させることができます。 nginx.conf内: ジェネラコディセタグプレ
これは、リクエストが常にhttpsであることを保証するためにも必要です。