我正在使用Tuckey UrlRewrite设置URL规则。到目前为止,一切正常,但是我在默认页面上苦苦挣扎。
目标:-任何与现有文件不匹配的请求;或-任何不符合先前规则的请求…都应通过搜索启动search.jsf?q=。它的意思是处理来自旧网站的任何可能的无效链接,并用功能更强大的功能替换404页面(以帮助用户找到他实际正在寻找的内容)。
search.jsf?q=
部分代码(其他规则与第二个规则相似,只有“默认”规则使其崩溃):
<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
search.jsf
[^\s]+``search.jsf
其他所有规则都last="true"没有,因为它们都不应该重叠(很明显,这个总体除外)。
last="true"
我阅读了UrlRewriteFilter手册,但似乎找不到任何东西last="true",从理论上讲应该阻止该过程检查是否已找到其他匹配项。
非常感谢你!
我对曲棍球一无所知,但我可以想到两个简单的解决方案:
1 创建搜索规则一样,重写一个url像/search?q=foo到/search.jspf?q=foo
/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:
/search
/search.jspf
<rule> <name>Default + 404</name> <from>^/[^\s]+$</from> <to type="forward">^/search?q=$1</to> </rule>
2 重写默认规则的匹配正则表达式,以明确排除search.jspf使用负前瞻:
search.jspf
<rule> <name>Default + 404</name> <from>^/(?!search.jspf)[^\s]+$</from> <to type="forward">^/search.jspf?q=$1</to> </rule>