nginx で Sinatra が https を http にリダイレクトする問題を修正する方法

StackOverflow https://stackoverflow.com/questions/6330595

  •  27-10-2019
  •  | 
  •  

質問

私は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であることを保証するためにも必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top