我正在使用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.
答案 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>