JSF UrlRewriteFilter catchall / 404替换

时间:2013-08-14 19:38:23

标签: regex jsf tomcat http-status-code-404 tuckey-urlrewrite-filter

我正在使用Tuckey UrlRewrite设置网址规则。到目前为止,一切都工作,但我正在努力使用我的默认页面。

目标: - 任何与现有文件不匹配的请求;要么 - 任何不符合先前规则的请求 ...应通过search.jsf?q=启动搜索。它旨在处理来自遗留网站的任何可能的死链接,并用更具功能性的东西替换404页面(以帮助用户找到他实际上正在寻找的东西)。

部分代码(其他规则类似于第二个规则,只有“默认”规则使其崩溃):

<rule>
  <name>Home</name>
  <from>^/$</from>
  <to type="forward" last="true">/home.jsf</to>
</rule>

<rule>
  <name>Contact Us</name>
  <from>^/contact_us/?$</from>
  <to type="forward" last="true">/contactUs.jsf</to>
</rule>

<rule>
  <name>Default + 404</name>
  <from>^/[^\s]+$</from>
  <to type="forward">^/search.jsf?q=$1</to>
</rule>

即使存在与search.jsf匹配的物理文件,它也会导致堆栈溢出,因为它匹配[^\s]+search.jsf

其他每条规则都有last="true",因为它们之间都不应该重叠(显然除此之外)。

我读了UrlRewriteFilter manual,除了last="true"之外似乎找不到任何东西,从理论上讲,如果已经找到了其他匹配项,它应该停止检查其他匹配。

非常感谢!

编辑:由于缺乏答案和我无法解决这个问题,我检查了另一种方法。请参阅this question here.

1 个答案:

答案 0 :(得分:1)

我对tuckey一无所知,但我能想到两个简单的解决方案:

1 为搜索创建规则,例如将/search?q=foo重写为/search.jspf?q=foo

我猜是这样的:

<rule>
  <name>Search</name>
  <from>^/search\?(.*)$</from>
  <to type="forward" last="true">/search.jsf?\1</to>
</rule>

然后只需将默认规则更改为使用/search而不是实际文件/search.jspf

<rule>
  <name>Default + 404</name>
  <from>^/[^\s]+$</from>
  <to type="forward">^/search?q=$1</to>
</rule>

2 重写默认规则的匹配正则表达式,使用否定前瞻专门排除search.jspf

<rule>
  <name>Default + 404</name>
  <from>^/(?!search.jspf)[^\s]+$</from>
  <to type="forward">^/search.jspf?q=$1</to>
</rule>