【问题标题】:UrlRewriteFilter Direct to httpsUrlRewriteFilter 直接到 https
【发布时间】:2011-03-24 00:54:41
【问题描述】:

我正在使用 UrlRewriteFilter 重定向到 SSL。我正在运行 Glassfishv2。

我的规则现在看起来像这样。它在我的war文件夹的WEB-INF中的urlrewrite.xml中。是否需要设置其他 glassfish 设置?

<rule>
        <condition name="host" operator="notequal">https://abc.def.com</condition>
     <condition name="host" operator="notequal">^$</condition>
     <from>^/(.*)</from>
     <to type="permanent-redirect" last="true">https://abc.def.com/ghi/$1</to>
    </rule>

但 FF 一直说 URL 重定向规则永远不会完成。我不确定这里发生了什么。有什么想法吗?

【问题讨论】:

    标签: java glassfish url-rewriting


    【解决方案1】:

    我怀疑问题在于host 标头的值(您正在与之比较)不包含用于访问资源的方案,而您的比较值则包含。这意味着条件始终为真,因为主机永远不会等于您要与之比较的主机,从而导致无限重定向循环。

    查看UrlRewriteFilter 的文档,您应该能够执行以下操作来获得您想要的:

    <rule>
        <condition type="scheme" operator="notequal">https</condition>
        <condition name="host" operator="equal">abc.def.com</condition>
        <from>^/(.*)</from>
        <to type="permanent-redirect" last="true">https://abc.def.com/ghi/$1</to>
    </rule>
    

    【讨论】:

    • 非常感谢 Tim & Vineet。规则中缺少的方案是问题所在,现在它可以正确重定向。
    • 在第一个条件中使用类型的方案对我不起作用。我用这个代替它确实有效: ^HTTPS$
    【解决方案2】:

    url重写规则中指定的主机名值不能包含scheme。 UrlRewriteFilter 在内部使用 Servlet API 方法来确定主机名,通过request.getServerName();此方法调用从不返回方案,因此您最好单独执行方案验证(正如 Tim 所暗示的那样)。

    如果您注意到其他可用方法,则必须单独进行方案验证,因为该方案仅通过 API 中的 request.getScheme() 方法可用,该方法通过 UrlRewriteFilter 单独公开。

    FF 报告重定向错误的真正原因可能是由于多个 302 被发送回客户端,用于原始请求(以及客户端发出的后续请求)。您可能希望监控 HTTP 流量,以确定在 HTTPS 重定向失败时是否存在规则,以及应用程序中行为的实际原因。

    编辑:

    如果可能,您可以调查 web.xml 中 CONFIDENTIAL transport guarantee 元素的使用情况,以确保 servlet 容器强制所有 HTTP 请求通过 SSL 发出。

    【讨论】:

      【解决方案3】:

      我不确定你上面的例子有什么问题,但这是可以使用 OCPsoft rewrite 轻松解决的可爱问题之一,另一个开源 URLRewriteFilter

      @Override
      public Configuration getConfiguration(final ServletContext context)
      {
      
         return ConfigurationBuilder.begin()
           .defineRule()
      
           .when(Direction.isInbound()
               .and(Domain.matches("abc.def.com"))
               .and(Path.matches("/{path}").where("path").matches(".*"))
               .andNot(Scheme.matches("https"))
           .perform(Redirect.to("https://abc.def.com/{path}"));
      
      }
      

      Scheme 对象从 Rewrite 版本 1.0.1 开始可用:http://ocpsoft.org/rewrite/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-17
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-11
        相关资源
        最近更新 更多