Pretty-Faces重定向循环

时间:2013-04-30 11:53:29

标签: redirect prettyfaces trailing-slash

我在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>

2 个答案:

答案 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()子句中的正则表达式,但应该是这样的。我希望这有帮助!