ややこしいですが、自分なりの「答え」を見つけました。
ドキュメントから確認できることに基づいて、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 に実装することです。
しかし、このソリューションは機能し、さまざまな状況に適応できます。誰かが別のより良い解決策を考え出さない限り、この解決策が私が使用しているものです。