Tuckey URLRewrite フィルターを使用して、Tomcat でクロスコンテキスト リクエスト転送を実行できるようにしたいと考えています。たとえば、着信リクエストをhttp://example.com/group-elements/300245/some-descriptive-textのような SEO/ユーザーフレンドリーな URL でルーティングできるようにしたいと考えています。 " はデプロイされたアプリケーションの名前ではなく、 http://example.com/foo/app/group/300245/elementsのように、アプリケーション 'foo' の Java Spring コントローラー メソッドにマップされた URLです。Tomcat 7.0.27 と URLRewrite 3.2.0 を使用しています。Java Spring 3.1 Web アプリケーションを使用しています。
URLRewrite 3.20のドキュメントには、「to」フィルター パラメーター要素のオプションの「context」属性が記載されています。
If your application server is configured to allow "cross context" communication then this attribute can be used to forward (and only forward, not redirect or other "to" types) requests to a named servlet context.
On Tomcat, for instance, the application contexts in the server configuration (server.xml or context.xml) need the option crossContext="true". For instance, the two applications mentioned before ("app" and "forum") have to be defined as:
<Context docBase="app" path="/app" reloadable="true" crossContext="true"/>
<Context docBase="forum" path="/forum" reloadable="true" crossContext="true"/>
それと機能に関する元の議論を考えると、「コンテキスト」属性は私が探しているもののようです。ただし、クロスコンテキスト リクエスト転送を適切に有効にすることができませんでした。
conf/server.xml の「コンテキスト」エントリ アプリケーション「foo」は次のとおりです。
<Context docBase="foo" path="/foo" reloadable="true" crossContext="true"/>
webapps/ROOT/WEB-INF/ に urlrewrite.xml ファイルと web.xml ファイルがあります。それらは次のようになります。
urlrewrite.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<rule>
<from>baz</from>
<!-- Note: this 'to' element's value has an error. See the edit at bottom of this post for corrected version. -->
<to context="foo">/foo/app/group/300245/elements</to>
</rule>
</urlrewrite>
web.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd" version="2.5">
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
上記の urlrewrite.xml で定義されたルールは、意図的に基本的なものであり、ハードコーディングされています。この場合、「to」と「from」で正規表現を作成する前に、ルールのクロスコンテキストの側面を機能させようとしているだけです。
そのルールを使用してhttp://example.com/bazをリクエストすると、Tomcat は「リクエストされたリソース (/baz) は利用できません」という 404 エラーを返します。「to」フィルター パラメーターでいくつかのバリエーションを試しましたが、まだ何も機能していません。また、「コンテキスト」の使用方法の例を見つけることができませんでした。
この種のクロスコンテキスト リクエスト フィルタリングを機能させる方法についてのアイデアはありますか? それは可能ですか?foo.war の名前を ROOT.war に変更するか、ここで述べたようにルート アプリケーションを変更することで、私がやろうとしていることを達成できるかもしれないと思いますが、実行できない場合や実行できない場合を除き、URLRewrite を介してこれを試してみたいと思います。一見悪い考えです。
私の構成をさらに表示することが役立つ場合は、お知らせください。ご意見をお寄せいただきありがとうございます。
編集:
役に立つ回答をしてくれた Christopher Schultz に感謝します。私の場合、問題の原因は次の 2 つです。1) webapps/ROOT/META-INF に context.xml ファイルがないこと、および 2) webapps/ の URL 書き換えルールの「to」要素にエラーがあることです。 ROOT/WEB-INF/urlrewrite.xml.
この修正には、適切な context.xml ファイルを webapps/ROOT/META-INF に配置することが含まれていました。この問題に遭遇した他の人の参考のために、そのファイルは次のようになりました。
webapps/ROOT/META-INF/context.xml
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="ROOT" path="/" reloadable="true" crossContext="true" />
Schultz が言及しているように、特定の URL 書き換えルール (ここでは、ROOT) の「from」要素で暗示されたコンテキストに対して、crossContext="true" を含むコンテキストを定義する必要があるだけです。「to」URL 書き換えルールでアプリケーションのコンテキストを明示的に定義する必要はありません。つまり、そのアプリケーションの context.xml ファイルを手動で作成する必要はありません。したがって、上記の例を続けると、context.xml ファイルを手動で定義して webapps/foo/META-INF に配置する必要がなくなります。 /。
Schultz の回答は、Tomcat の公式ドキュメント ( http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Defining_a_context ) でコンテキストを定義するための推奨事項を反映しています。
この問題は、最初の投稿の URL 書き換えルールにエラーがあったことも原因でした。正しいバージョンは次のとおりです。
urlrewrite.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<rule>
<from>baz</from>
<!-- Note: the use of '/app' instead of '/foo/app/' below -->
<to context="foo">/app/group/300245/elements</to>
</rule>
</urlrewrite>