【问题标题】:Pretty-Faces redirect loopPretty-Faces 重定向循环
【发布时间】:2013-04-24 08:04:45
【问题描述】:

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

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

编辑:

browse 可能是保留关键字吗?当我用松鼠替换它时,一切都按预期工作:

<rewrite match="/squirrel" trailingSlash="append" toCase="lowercase" />
<url-mapping id="browsecategory">
    <pattern value="/squirrel/" />
    <view-id value="/browser.xhtml" />
</url-mapping>

【问题讨论】:

  • 嗨!我面临着类似的问题。在重定向循环期间会发生什么?就我而言,浏览器会在停止之前多次附加 /index.jsp。

标签: redirect prettyfaces trailing-slash


【解决方案1】:

问题是您的trailingSlash 重写规则也匹配/browse 之类的内容。您可以尝试这样调整吗:

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

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

【讨论】:

  • 谢谢,试过了,但还是把我带到localhost:8081/App/browse///////////////////
  • 我很惊讶会出现这种情况。您是否完全重新部署了应用程序?
  • yes =(你有一个小项目可以试试吗?
  • 我目前没有。我可以设置一个,但要休息一晚。如果您前往支持论坛,您可以上传一个重现此内容的示例项目,我明天会看一下:ocpsoft.org/support
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢,maven 有版本 4 吗?我只能找到 3.3.3,顺便说一下,你知道为什么 3.3.3 不可能吗?我的配置错了吗?还是会与 spring 或 primefaces 发生冲突?
  • ps:我使用 servlet 3 并且在我的 web.xml 中没有配置
  • 嘿,对不起。是的。版本 4 在 Maven 中可用 - 只需按照此处的说明进行操作:ocpsoft.org/prettyfaces
  • 你能给我一个更准确的链接吗?默认的 Maven 存储库不包含版本 4
  • 抱歉,PrettyFaces 4 是 Rewrite 2.0.0 - search.maven.org/…
猜你喜欢
  • 2020-03-02
  • 2011-10-24
  • 2014-05-10
  • 2013-08-14
  • 2020-12-04
  • 2017-02-11
  • 2013-07-28
  • 2015-03-21
  • 2017-05-17
相关资源
最近更新 更多