1

私は遊びを持っています!HTTP および HTTPS を使用する必要があるアプリケーション。アプリケーションは、Web リクエストを play アプリケーションに転送するプロキシ サーバー (Apache を使用) の背後で実行されています。

プロキシは、HTTP 要求用の 1 つのポートと、HTTPs 要求用の別のポートを使用しています。プロキシのポートは、Play アプリケーションで使用されるポートと同じではないことに注意してください (これはプロバイダーの制限によるものです!)。

Play アプリケーションは、HTTP には「標準」ポート 9000 を使用し、HTTPs には 9443 を使用しています。プロキシはポート 8080 で HTTP リクエストを受信し、Play のポート 9000 に転送します。プロキシはポート 8090 で HTTP リクエストを受信し、Play のポート 9443 に転送します。

私の問題は、ページを Play に表示する secure() メソッドを使用すると、Play のロジックにより、アプリが HTTP のポートとして 9443 を使用しようとすることです。これにより、プロキシが別のポートを使用しているため、要求が失われます。

HTTPS から HTTP に切り替えたい場合も同じことが発生するようです。プロキシが使用するポートにシステムを移動させることができないようです。

どういうわけか、ルートを台無しにすることなく、プロキシサーバーが認識しているポートにシステムを接続させる必要があります。これを行う方法はありますか?

ヘルプ/洞察をお寄せいただきありがとうございます。

4

2 に答える 2

1

ややこしいですが、自分なりの「答え」を見つけました。

ドキュメントから確認できることに基づいて、Play アプリケーションがプロキシの背後にある場合にポートを切り替えるように Play に指示する方法は実際にはありません。これは、Play はリクエストが入ってくるポートを認識しますが、安全なポートと安全でないポートの間を行き来するときにどのプロキシポートを使用すべきかを知る方法がないためです。たとえば、HTTP 要求がプロキシ ポート 8080 を介して送信されることを認識しており、ポート 9000 への後続の要求がそのプロキシ ポートから送信されることを認識しています。http://toproxy:8080/links誰かが https を使用してポート 9443 にアクセスしようとした場合に、別のプロキシ ポートに切り替えることを認識していません。 の場合、Play はリンクを次のように解決します。https://toproxy:8080-- プロキシ サーバーが HTTPS 要求にポート 8090 を使用する可能性があるにもかかわらず。プロキシ ポート 8080 は Play のポート 9000 にリダイレクトされるため、HTTPS リクエストにそのポートを使用すると常に失敗します。これは、Play 1.X だけでなく Play 2.0 にも当てはまります。

Play には、プロキシ ポートを HTTP および HTTPS ポートにマップするよう指示できる標準的な設定パラメータが必要だと思います。そうすれば、プロキシ サーバーの背後にある場合、開発者は secure() メソッドを使用でき、Play は URL を正しいプロキシ ポートに解決できます。この機能は、バージョン 2 だけでなく 1.X でも利用できるはずです。

誰かが実際にこれを実装するまで (時間があればそうするかもしれませんが、私が全力を尽くしているので、人々は息を止めてはいけません)、HTTP と HTTPS を切り替えるには、単純に redirect() メソッドを使用するのが私の難題です。プロキシ ポート。redirect() メソッドを使用すると、完全な URL を入力できるように見えるので、リクエストを切り替えるページの完全な URL を呼び出すだけです。

例: 前述のページhttp://toproxy:8080/linksに、HTTPS を使用して保護したいログイン ページへのリンクがあるとします。これを行うために、2 つのアクションを作成します。1 つはプロキシ HTTPS ポートへのリダイレクト用 (この例では gotoLogin() と呼びます) で、もう 1 つはログイン ページを実際にレンダリングするためです (この例では loginPage() と呼び、 /loginpage のルート)。

gotoLogin() では、次の方法で loginPage にリダイレクトします。

リダイレクト("https://toproxy:8090/loginpage");

これにより、Play はプロキシ ポート 8090 で受信し、Play のポート 9443 にリダイレクトされます。

ユーザーが適切にログインすると、私の認証アクションは単純に別の redirect() 呼び出しを使用します。

リダイレクト("http://toproxy:8080/destination_page");

これにより、Play は安全でないリクエストに対して適切なプロキシ ポートに戻ります。

これは、この問題の最善の解決策ではありません。HTTP ポートと HTTPS ポートの間で適切な切り替えを行うようにプロキシ サーバーを何らかの方法で構成できる可能性がありますが、これを調査するには、プロキシ サーバー構成の専門家ではない人 (これについて説明します!) には時間がかかる場合があります。もちろん、最善の解決策は、以前に説明したようなプロキシ ポート処理を Play に実装することです。

しかし、このソリューションは機能し、さまざまな状況に適応できます。誰かが別のより良い解決策を考え出さない限り、この解決策が私が使用しているものです。

于 2012-07-23T16:02:39.937 に答える
0

Play はリクエストの送信元のポートを認識し、そのポートを使用する必要があります。Apache の設定が正しく設定されていない可能性があります。

Apache の設定に次の行を追加しましたか?

ProxyPreserveHost on

XForwardedSupport=127.0.0.1サーバー構成によっては、必要になる場合もあります。

于 2012-07-08T07:17:03.917 に答える