最近、SpringアプリをSpring Boot(Tomcatが埋め込まれている)に移行しました。現在、Kubernetesに移行しています。 Kubernetesへの移行の一環として、Apache構成を独自のサービスに分離し、Kubernetesにデプロイして、SpringBootアプリのプロキシとして機能させます。
私の現在のセットアップは、世界中からのリクエストを受け入れるLoadBalancerサービスを備えたApacheです。これにより、これらのリクエストが取得され、ClusterIPサービスを備えたSpringBootアプリに転送されます。
また、注意することが重要です。私のApacheはすべてのhttpをhttpsにリダイレクトします。
Spring Bootアプリがクライアントにリダイレクトを返すときは常に、応答のロケーションヘッダーはhttpsではなくhttpです(httpsを介して行われたリクエストのみがApacheプロキシを介してアプリに送信されます)。
例:
ログインしていないユーザーは、次の場所に移動します。
https://example.com/admin
認証されていない場合、管理ページはユーザーをログインページにリダイレクトします。これは、次のリダイレクトの1つである必要があります。
https://example.com/login
ただし、現状では、私のアプリはユーザーを次の場所にリダイレクトします。
http://example.com/login
そして、ユーザーはApacheによって次の場所に再度リダイレクトされます。
https://example.com/login
ログをチェックして、アプリが受信するリクエストにX-Forwarded-Proto: https
ヘッダーが含まれていることを確認しました。これは、私が理解していることから、リダイレクト応答httpsの場所ヘッダーを作成する必要があります。
いくつかのStackOverflowの投稿で述べたように、server.use-forward-headers=true
ファイルにapplication.properties
を追加しようとしましたが、何もしませんでした。また、server.Tomcat.protocol-header=X-Forwarded-Proto
を追加しようとしましたが、これも何もしませんでした(そして、私が読んだものから、とにかくデフォルトです)。
networkCIDR
は、TomcatのRemoteIPValve
の内部プロキシのリストに含まれています。X-Forwarded-For
も影響がないようですので、問題はすべてのフォワードヘッダーにあると思います私はそれを考え出した。私の間違いは、networkCIDR
がrequest.getRemoteAddr()
によって返されたIPアドレスであり、実際にはk8sの内部クラスターIPであると想定していたことです。これは、リクエストがクラスター内にあるApacheから送信されていることを考えると理にかなっています。内部クラスターIPは内部プロキシのリストに含まれていなかったため、RemoteIPValve
はフォワードヘッダーを利用していませんでした。
RemoteIpValve
で指定されたデフォルト値と内部クラスターIPを使用してserver.Tomcat.internal-proxies
プロパティをapplication.properties
に追加することにより、すべてが正常に機能しました。