我在tomcat 7中使用漂亮的脸3.3.3
和此配置
<rewrite match="/browse" trailingSlash="append" toCase="lowercase" />
<url-mapping id="browsecategory">
<pattern value="/browse/" />
<view-id value="/browser.xhtml" />
</url-mapping>
我希望在“浏览”之后没有尾随斜杠的请求被重定向到浏览/(带有斜杠)。背景:如果缺少尾部斜杠,我的相对outputLinks既不是子目录,也不是当前目录中的文件。
我现在要求
localhost:8081/App/browse
我的浏览器进入重定向循环
编辑:
浏览是否可能是保留关键字?当我用松鼠替换它时,一切都按预期工作:
<rewrite match="/squirrel" trailingSlash="append" toCase="lowercase" />
<url-mapping id="browsecategory">
<pattern value="/squirrel/" />
<view-id value="/browser.xhtml" />
</url-mapping>
答案 0 :(得分:1)
问题是您的trailingSlash
重写规则还匹配/browse
之类的内容。你能尝试像这样调整它:
<rewrite match="^/browse$" trailingSlash="append" toCase="lowercase" />
我认为这应该有效,因为该规则现在只与/browse
完全匹配,而不是/browse/
。
答案 1 :(得分:1)
由于在PrettyFaces中使用<rewrite/>
标记发生了混乱,我们已迁移到PrettyFaces的新核心架构(// Rewrite 2.0.0.Final),可以更好地控制应用配置。 (此处http://ocpsoft.org/prettyfaces/)
如果您的环境允许,我建议您尝试使用PrettyFaces 4。如果您愿意,可以将URL映射保留在pretty-config.xml文件中,但现在可以在重写ConfigurationProvider
中更安全地定义更多自定义重写规则:
<!-- for JSF 2.x -->
<dependency>
<groupId>org.ocpsoft.rewrite</groupId>
<artifactId>rewrite-servlet</artifactId>
<version>2.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.ocpsoft.rewrite</groupId>
<artifactId>rewrite-config-prettyfaces</artifactId>
<version>2.0.0.Final</version>
</dependency>
保留你的pretty-config.xml原样:
<url-mapping id="browsecategory">
<pattern value="/browse/" />
<view-id value="/browser.xhtml" />
</url-mapping>
现在还create a ConfigurationProvider来处理你的尾随斜杠:
public class RewriteConfig extends HttpConfigurationProvider
{
@Override
public int priority()
{
return 10;
}
@Override
public Configuration getConfiguration(final ServletContext context)
{
return ConfigurationBuilder.begin()
.addRule()
.when(Direction.isInbound().and(Path.matches("/{p}")))
.perform(Redirect.to(context.getContextRoot() + "/{p}/"))
.where("p").matches("^.*[^/]$");
}
}
不要忘记register/activate the ConfigurationProvider。
此外,您也可以在此配置文件中进行URL映射,从而无需使用pretty-config.xml或PrettyFaces 4 con:
public class RewriteConfig extends HttpConfigurationProvider
{
@Override
public int priority()
{
return 10;
}
@Override
public Configuration getConfiguration(final ServletContext context)
{
return ConfigurationBuilder.begin()
.addRule(Join.path("/browse/").to("/browser.xhtml"))
.addRule()
.when(Direction.isInbound().and(Path.matches("/{p}")))
.perform(Redirect.to(context.getContextRoot() + "/{p}/"))
.where("p").matches("^.*[^/]$");
}
}
我没有测试matches()
子句中的正则表达式,但应该是这样的。我希望这有帮助!