web-dev-qa-db-ja.com

TomcatはWebアプリのコンテキストに末尾のスラッシュを追加していません

URLがスラッシュなしで入力された場合、Tomcatにアプリのコンテキストに末尾のスラッシュを自動的に追加させたいのですが。

Jettyでテストすると、アプリのコンテキストに末尾のスラッシュが自動的に追加されますが、Tomcatはこれを行いません。

WARを他の誰かに渡しているので、デプロイされたコンテキストの名前がわかりません。そのため、HTML内のリソース参照はすべて相対的です。末尾にスラッシュを追加して、Tomcatを同じコンテキストに自動的にリダイレクトする方法はありますか?

現在、Spring3でTomcat7を使用しています。

19
Badweather

これは古い投稿ですが、Tomcat 7.0.67以降、context.xmlファイルに次の属性を追加する必要があります。

<Context mapperContextRootRedirectEnabled="true">...</Context>

7.0.67による 変更ログ

末尾の/がマッパーからDefaultServletに追加されるコンテキストルートとディレクトリのリダイレクトを提供する機能を移動します。これにより、リダイレクトが行われる前に、このような要求を構成済みのバルブとフィルターで処理できます。この動作は、以前の動作を復元するために使用できるコンテキストのmapperContextRootRedirectEnabled属性とmapperDirectoryRedirectEnabled属性を介して構成できます。

そしてTomcatのコンテキストでは ドキュメント

mapperContextRootRedirectEnabled:有効にすると、Webアプリケーションコンテキストルートのリクエストは、必要に応じて、デフォルトのサーブレットではなくマッパーによってリダイレクトされます(末尾にスラッシュが追加されます)。これはより効率的ですが、コンテキストパスが存在することを確認するという副作用があります。指定しない場合、デフォルト値のfalseが使用されます。

29
Pat

アプリケーションのweb.xmlに"/*"へのマッピングがあるようです。サーブレット-"/*"にマッピングすると、TomcatはリクエストをそのままWebアプリケーションに渡します(つまり、リダイレクトしません)。

正しくリダイレ​​クトするには、"/*"マッピングを"/"だけに変更する必要があります。後者はデフォルトのサーブレットを意味します。

6
alexgirao

Tomcatは、末尾にスラッシュを自動的に追加します。 Tomcatに付属のサンプルアプリケーションでテストするだけです。

特別な構成のためにそうでない場合は、クエリ文字列を調べて、アプリケーションの必要に応じてリダイレクトするフィルターを作成します。多くの場合、これはとにかく必要です(http-> httpsリダイレクトなどを実行します)

5
Istvan Devai

TomcatでURL書き換えを試してみましたか?
これは役立つかもしれません: http://code.google.com/p/urlrewritefilter/

それでも問題が解決しない場合は、次を確認してください。 Tomcat web.xmlでのURL書き換え

0
Ervi B

パットの優れた答えは、私がこれについてさらにいくつかの詳細を掘り下げるのに役立ちました。これは、Tomcatの一部のバージョン(7.0.67以降のTomcat 7、および8.29〜8.37のTomcat 8)のいくつかの癖に関連しているようです。これは、セッションCookieとURLリダイレクトに関係しています。

結論として、Javaサーバーがパス固有のセッションCookieを作成し、末尾にスラッシュが付いている場合( "/ app_name /"など)、サーバーは自動イニシャルも実行する必要があるようです。リダイレクト(/ app_name->/app_name /)...そうでない場合、セッションCookieはリクエストとともに送信されず、有効なセッションがあるようにサーバーを参照しません。これにより、からのリダイレクトループが発生する可能性があります。認証へのアプリ。

Tomcatには両方の動作を制御する構成がありますが、私が知る限り、これらのバージョンでは基本的に同期がとれておらず、Cookiewith末尾のスラッシュ、リダイレクトを取得せずに。 Tomcatの変更ログにはいくつかの関連する問題/変更があります: https://Tomcat.Apache.org/Tomcat-8.0-doc/changelog.html

Patがすでに述べたように、これは、この属性をアプリのContext要素に追加することで解決されます。

<Context mapperContextRootRedirectEnabled="true">
0
em_bo