1

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

我希望将“browse”之后不带斜杠的请求重定向到browse/(带有斜杠)。背景:如果缺少尾部斜杠,我的相对输出链接不会作为子目录处理,而是作为当前目录中的文件处理。

当我现在要求

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>
4

2 回答 2

1

问题是您的trailingSlash重写规则也与/browse. 你能试着像这样调整它:

<rewrite match="^/browse$" trailingSlash="append" toCase="lowercase" />

我认为这应该可行,因为该规则现在只会完全匹配/browse而不是/browse/.

于 2013-04-30T12:25:38.793 回答
1

由于使用<rewrite/>PrettyFaces 中的标签会造成大量混乱,我们已经迁移到 PrettyFaces 的新核心架构(//Rewrite 2.0.0.Final),它可以更好地控制应用程序配置。(可在此处获得 http://ocpsoft.org/prettyfaces/

如果您的环境允许,我建议您尝试 PrettyFaces 4。如果您愿意,可以将 URL 映射保留在 pretty-config.xml 文件中,但您现在可以在 Rewrite 中更安全地定义更多自定义 Rewrite 规则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>

现在还创建一个 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("^.*[^/]$");
    }
}

不要忘记注册/激活 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()子句中的正则表达式,但它应该是这样的。我希望这有帮助!

于 2013-04-30T15:30:55.730 回答