我希望能够做到跨上下文请求转发到Tomcat与Tuckey URLRewrite过滤器。 例如,我想能够路由与像一个SEO- /用户友好的URL的输入请求http://example.com/group-elements/300245/some-descriptive-text ,其中“组元素“不是部署的应用程序的名称,映射到一个Java春季控制器方法应用‘富’,就像一个URL http://example.com/foo/app/group/300245/elements 。 我使用Tomcat 7.0.27和3.2.0 URLRewrite; 我与Java春3.1的Web应用程序的工作。
所述URLRewrite 3.20文档注意到用于“到”滤波器参数元件一个可选的“上下文”属性:
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中我的“语境”入境申请“富”:
<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上面定义的规则是有意基本和硬编码的。 在这种情况下,我只是试图让规则制定的正则表达式“到”和“从”前工作的跨情境的方面。
当我要求http://example.com/baz与地方的规则下,Tomcat返回404错误说“所请求的资源(/巴兹)不可用。” 我试着在“到”滤波器参数有一些变化,但没有尚未奏效。 我一直没能找到如何“语境”,应使用任何例子。
我如何能得到这种跨上下文请求过滤的任何想法来工作? 它甚至有可能? 我想我也许可以达到我想要重命名foo.war到ROOT.war或叙述改变根应用做在这里 ,但我想尝试通过URLRewrite这样做,除非这样做是不可行或在其正面是一个坏主意。
如果显示更多我的配置中会有所帮助,请让我知道。 感谢您事先的任何输入。
编辑 :
由于克里斯托弗·舒尔茨为有用的答案。 1)不具有的webapps / ROOT / META-INF一个context.xml文件,和2)具有错误在“到”元素中的URL重写规则中的webapps /:在我的情况下,问题是由两个因素引起ROOT / WEB-INF / urlrewrite.xml。
此修复程序涉及到把一个正确的context.xml文件中的webapps / ROOT / META-INF。 对于其他任何人遇到这个问题的参考,该文件最终看上去是这样的:
web应用/ ROOT / META-INF / context.xml的
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="ROOT" path="/" reloadable="true" crossContext="true" />
正如舒尔茨提到,它是只需要与crossContext =“真”的上下文中给定的URL重写规则(在这里,这是ROOT)在“从”元素所隐含的背景下定义。 这是没有必要明确定义上下文中“到” URL重写规则的应用程序。 换句话说,你不应该需要手动创建该应用程序的context.xml文件 - 因此继续上面的例子,你就不需要手动定义,把一个context.xml文件到的webapps /富/ META-INF /。
舒尔茨的回答反映了官方的Tomcat文档中定义的上下文中的建议: http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Defining_a_context 。
这个问题也得到了事实,在我最初的文章的网址重写规则有一个错误引起的。 正确的版本应该是:
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>