您好,我在tomcat 7中使用的是pretty faces 3.3.3
和这个配置
<rewrite match="/browse" trailingSlash="append" toCase="lowercase" />
<url-mapping id="browsecategory">
<pattern value="/browse/" />
<view-id value="/browser.xhtml" />
</url-mapping>我希望在“浏览”之后没有斜杠的请求被重定向到browse/ (带有尾随斜杠)。背景:如果尾部的斜杠丢失,则我的相对outputLinks不会作为子目录处理,而是作为当前目录中的文件处理。
当我现在请求的时候
localhost:8081/App/browse 我的浏览器进入了重定向循环
编辑:
是否有可能browse是保留关键字?当我用squirrel替换它时,一切都按预期运行:
<rewrite match="/squirrel" trailingSlash="append" toCase="lowercase" />
<url-mapping id="browsecategory">
<pattern value="/squirrel/" />
<view-id value="/browser.xhtml" />
</url-mapping>发布于 2013-04-30 23:30:56
由于在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 4con的需要:
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()子句中测试正则表达式,但它应该是这样的。我希望这能帮到你!
发布于 2013-04-30 20:25:39
问题是您的trailingSlash重写规则也与/browse之类的规则相匹配。你能试着这样调整它吗:
<rewrite match="^/browse$" trailingSlash="append" toCase="lowercase" />我认为这应该是可行的,因为规则现在只与/browse而不是/browse/完全匹配。
https://stackoverflow.com/questions/16299270
复制相似问题