一尘不染

JSF UrlRewriteFilter catchall / 404替换

tomcat

我正在使用Tuckey UrlRewrite设置URL规则。到目前为止,一切正常,但是我在默认页面上苦苦挣扎。

目标:-任何与现有文件不匹配的请求;或-任何不符合先前规则的请求…都应通过搜索启动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手册,但似乎找不到任何东西last="true",从理论上讲应该阻止该过程检查是否已找到其他匹配项。

非常感谢你!


阅读 205

收藏
2020-06-16

共1个答案

一尘不染

我对曲棍球一无所知,但我可以想到两个简单的解决方案:

1 创建搜索规则一样,重写一个url像/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>
2020-06-16