2012-06-15 105 views
16

URLを入力しないと、Tomcatは自動的にアプリケーションのコンテキストに末尾のスラッシュを追加します。TomcatはWebアプリケーションのコンテキストに末尾のスラッシュを追加していません

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

私はWARを誰かに渡しているので、展開されたコンテキストの名前は不明です.HTMLのリソース参照はすべて相対的です。 Tomcatが後続のスラッシュを追加して同じコンテキストに自動的にリダイレクトさせる方法はありますか?

現在SpringでTomcat 7を使用しています。

+0

はまさにあなたの例を追加してください。やりたがって、スラッシュが必要な理由を明確にしたいですか? –

+0

基本的に私は 'http:// url.com/context'をロードする必要がありますhttp:// url.com/context /' Tomcatはすべてのデモアプリケーションに後続のスラッシュを追加します。 Jettyでアプリを実行すると、後続のスラッシュも自動的に追加されます。 スラッシュは 'context/resources /'にimage、css、jsなどがあり、htmlに相対パスを使用しているので必須です。したがって、 'src =" resources/image.jpg "'などです。 – Badweather

答えて

26

それは古い記事ですが、Tomcatの7.0.67のように、あなたのcontext.xmlファイルに次の属性を追加する必要があります。

:7.0.67 changelogを1として

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

MapperからDefaultServletに/が追加されたコンテキストルートおよびディレクトリのリダイレクトを提供する機能を移動します。これにより、リダイレクトが行われる前に、コンフィグレーションされたバルブおよびフィルタによってそのような要求を処理することができます。この動作は、以前の動作を復元するために使用されるContextのmapperContextRootRedirectEnabled属性とmapperDirectoryRedirectEnabled属性によって設定できます。

とTomcatのコンテキストdocumentation

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

+0

Sneaky Tomcat!私は何日も無駄になっていたWebアプリケーションを間違って調べようとしました。レッスンの再学習:他のすべてが失敗した場合、RTFM! –

+0

これは私の人生を節約する、私はmapperContextRootRedirectEnabledのデフォルト値はtrueだと思うので、それらを追加する必要はありません。 –

+2

はい、7.0.68 – Pat

5

Tomcatは自動的に末尾にスラッシュを追加します。 Tomcatで提供されているサンプルアプリケーションでテストしてください。

場合によっては、特別な設定のために、クエリ文字列を調べてアプリケーションによって必要に応じてリダイレクトするフィルタを作成します。これはいつも必要です(http-> httpsリダイレクトなど)

+0

あなたが正しいです、Tomcatはこれらを自動的に追加します。なぜ私のアプリケーションでこの機能が無効になっているのか把握する必要があります。 – Badweather

+0

Tomcatの前に他のサーバーがありますか? Apache、nginxなど?それらはリダイレクションを台無しにする可能性があります。 –

+0

実際、その前にあるrproxyサーバは、私のために後続のスラッシュを追加することで問題を解決できます。私は問題は、Spring MVCが有効なURLとして後続のスラッシュなしでコンテキストを受け入れることと関係していると考えています。 – Badweather

6

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

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

+1

+1私の場合、私はSpring Securityが '/ *'を傍受するように設定しました。後続のスラッシュを追加するためにSpring Securityに利用可能な設定はありますか? – manikanta

0

パットの優れた答えは、これについてもう少し詳しく調べるのに役立ちました。これは、セッションクッキーとURLリダイレクトに関連するTomcatのバージョン(7.0.67以降のTomcat 7、および8.29〜8.37のTomcat 8)のいくつかの癖に関連しているようです。

最終的に、Javaサーバがパスの最後に「/ app_name /」などのスラッシュを含むセッションCookieを作成した場合、サーバーは自動初期リダイレクト(/ app_name - - >/app_name /)...そうしないと、セッションクッキーはリクエストとともに送信されず、有効なセッションを持っているかのようにサーバに送信されません。アプリから認証へのリダイレクトループが発生する可能性があります。

は、両方の動作を制御するのTomcatでの設定がありますが、私の知る限り、彼らは基本的にした同期外れこれらのバージョンでは、このような1はでクッキーを得るかもしれないことを最後のスラッシュ、なしリダイレクトを取得しています。 https://tomcat.apache.org/tomcat-8.0-doc/changelog.html

パットはすでに述べたように、これはあなたのアプリケーションのコンテキスト要素にこの属性を追加することで解決されています:Tomcatの変更履歴にはいくつかの関連する問題/変更はあり

<Context mapperContextRootRedirectEnabled="true"> 
関連する問題