首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >漂亮面孔重定向循环

漂亮面孔重定向循环
EN

Stack Overflow用户
提问于 2013-04-30 19:53:29
回答 2查看 1.2K关注 0票数 1

您好,我在tomcat 7中使用的是pretty faces 3.3.3

和这个配置

代码语言:javascript
复制
<rewrite match="/browse" trailingSlash="append" toCase="lowercase" />
<url-mapping id="browsecategory">
    <pattern value="/browse/" />
    <view-id value="/browser.xhtml" />
</url-mapping>

我希望在“浏览”之后没有斜杠的请求被重定向到browse/ (带有尾随斜杠)。背景:如果尾部的斜杠丢失,则我的相对outputLinks不会作为子目录处理,而是作为当前目录中的文件处理。

当我现在请求的时候

代码语言:javascript
复制
localhost:8081/App/browse 

我的浏览器进入了重定向循环

编辑:

是否有可能browse是保留关键字?当我用squirrel替换它时,一切都按预期运行:

代码语言:javascript
复制
<rewrite match="/squirrel" trailingSlash="append" toCase="lowercase" />
<url-mapping id="browsecategory">
    <pattern value="/squirrel/" />
    <view-id value="/browser.xhtml" />
</url-mapping>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中更安全地定义更多自定义重写规则

代码语言:javascript
复制
<!-- 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的原样:

代码语言:javascript
复制
<url-mapping id="browsecategory">
    <pattern value="/browse/" />
    <view-id value="/browser.xhtml" />
</url-mapping>

现在,还要使用create a ConfigurationProvider来处理尾部的斜杠:

代码语言:javascript
复制
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的需要:

代码语言:javascript
复制
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()子句中测试正则表达式,但它应该是这样的。我希望这能帮到你!

票数 1
EN

Stack Overflow用户

发布于 2013-04-30 20:25:39

问题是您的trailingSlash重写规则也与/browse之类的规则相匹配。你能试着这样调整它吗:

代码语言:javascript
复制
<rewrite match="^/browse$" trailingSlash="append" toCase="lowercase" />

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16299270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档