10

HTTPS でエンド ユーザーのリクエストを負荷分散するように ELB (Amazon Elastic Load Balancer) を構成しています。バックエンドでは、HTTP で構成された Tomcat サーバーでアプリケーションを実行しています。

そのため、エンド ユーザーがアプリケーションにリクエストを送信すると、リクエストは HTTPS で行われます。ELB にアクセスするため、ELB は内部的に HTTP で tomcat サーバーにリダイレクトします。Tomcat では、私のアプリケーションは Spring Security によって保護されており、リクエストが保護されたリソースに対するものであり、ユーザーがログインしていない場合、ユーザーは構成されたログイン ページにリダイレクトされます。Tomcat サーバーは最初に ELB から HTTP としてリクエストを取得したため、このエンド ユーザーへのリダイレクトは HTTP 経由になります。HTTP での内向きトラフィックを構成していないため、これで 404 が発生します。

この問題を解決するにはどうすればよいですか? エンドユーザー ELB と ELB-tomcat の両方で HTTPS を使用する唯一のオプションですか、それともここで何か不足していますか?

4

2 に答える 2

10

ELBはX-Forwarded-Proto、クライアントがロードバランサーへの接続に使用したプロトコルを通知できるヘッダーを設定します。ドキュメントを参照してください。

このヘッダーを確認するようにSpringSecurityを構成できます。たとえば、この回答を参照してください。

于 2012-03-29T12:59:51.177 に答える
0

私はこれをネットで見つけるのに苦労しましたが、ついにそれを行う方法を見つけました。

問題は、http が内部で ELB の https ポートにリダイレクトされるとすぐに、ポート 80 にリダイレクトされてループを作成していたことです。これは、ELB が SSL をオフロードしてからポート 80 に再度接続するために発生します。

最後に、いくつかの調査の結果、ELB がオフロードした場合でも SSL tomcat がオリジン リクエストが SSL を使用するようになるように、X-Forwarded-Proto を管理するための正しい書き換えルールを得ました。

これは、Tomcat 8 で Tomcat バルブを使用して行われます。以前のバージョンでも実行できると確信しています。バルブを使用して Tomcat で書き換えルールを有効にしました。その後は、Apache でリダイレクト ルールを記述するのと同じくらい簡単でした。

手順は次のとおりです。

ステップ1:

を。a. tomcat conf フォルダーの下にある context.xml を開きます。すぐ下に次の行を貼り付けます

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

注 : これにより、バルブがグローバルに有効になります。これを特定のホストに対して有効にする必要がある場合は、その特定のドメインの server.xml 内に貼り付ける必要があります。

ステップ2:

を。conf/server.xml を開きます。すぐ上に次の行を貼り付けます </Host>

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

ステップ 3:

を。web.xml があるフォルダーを開きます。たとえば、アプリケーションが ROOT でホストされている場合、web.xml は webapps/ROOT/WEB-INF の下にあります。

b. 同様に、アプリケーションが webapps/myappfolder でホストされている場合、web.xml は webapps/myappfolder/WEB-INF の下にあります。

c. WEB-INF フォルダーに新しいファイル rewrite.config を作成します。次の書き換えルールを貼り付けます。

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
于 2016-10-02T11:44:57.850 に答える