Apache和Resin组合时UrlRewriteFilter失效的解决方法

原文出处: http://www.javatang.com/archives/2010/08/27/3629451.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

 

目前在Spring3.0的官方example中都使用UrlRewriteFilter来做伪静态,单独运行在Resin等JavaEE Web容器中的时候一切都OK,但是一旦与Apache一起组合的时候总是会出现404或403错误,当然UrlRewriteFilter所设定的规则 也无效。

 

造成这种现象的原因是因为在默认情况下,静态的资源均由Apache进行处理,而jsp或者由web.xml所映射的servlet均交给 resin进行处理。如果web项目没有使用UrlRewriteFilter则一切OK,但是使用了UrlRewriteFilter之后,由 servlet所映射的地址并不是/*即所有资源了,而是类似/app/*这样的设置。也就是说,用户所请求的资源首先由Apache判断一下,然后再由 选择的交给Resin,最后才执行UrlRewriteFilter的规则。

 

知道了原因,解决的方法也就出来了,只要告诉Apache将所有的资源都交由Resin来处理就可以了,可以使用Resin的servlet-mapping方法进行配置,配置如下:

  1. < servlet-mapping url-pattern ='/*' servlet-name =' plugin_match ' />

其中plugin_match是Resin内置的servlet,按照resin官方的解释就是Resin告诉Apache将所有的符合url-pattern规则要求的请求都发送给它进行处理。

 

因为servlet-mapping是resin特有的,所以建议将此也放在resin-web.xml中,然后放在项目中的WEB-INF目录下:

  1. < web-app xmlns = " http://caucho.com/ns/resin "
  2.          xmlns:resin = " http://caucho.com/ns/resin/core " >
  3.     < servlet-mapping   url-pattern ='/*' servlet-name =' plugin_match ' />
  4. </ web-app >

 

参考资料:
Apache的UrlRewrite和Resin的配置问题
Resin官方对servlet-mapping的说明

你可能感兴趣的:(apache,Web,jsp,servlet,javaee)