14

nginx で実行されている Sinatra アプリがあり (バック プロキシとしてシンを使用) redirect '/<path>'、Sinatra でステートメントを使用しています。ただし、https でサイトにアクセスすると、これらのリダイレクトにより、本来のhttp://localhost/<path>ではなくに送信されますhttps://localhost/<path>

現在、nginx はこのコマンドで制御を thin に渡します。proxy_pass http://thin_clusterthin_cluster

upstream thin_cluster { server unix:/tmp/thin.cct.0.sock; }

どうすればこれを修正できますか?

4

2 に答える 2

22

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

于 2011-06-15T21:56:42.417 に答える
1

すべてのリンクを nginx レイヤーの https に強制的に移動できます。nginx.conf で:

server{
   listen 80;
   server_name example.com;
   rewrite    ^(.*) https://$server_name$1 redirect;
}    

これは、リクエストが常に https であることを保証するためにもあると便利です

于 2011-06-14T21:29:31.487 に答える