UrlRewriteFilter 直接到 https

Posted

技术标签:

【中文标题】UrlRewriteFilter 直接到 https【英文标题】:UrlRewriteFilter Direct to 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 重定向规则永远不会完成。我不确定这里发生了什么。有什么想法吗?

【问题讨论】:

【参考方案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/

【讨论】:

以上是关于UrlRewriteFilter 直接到 https的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.1路由直接到公共文件夹

UrlRewriteFilter 错误

使用UrlRewriteFilter对url进行更替

UrlRewriteFilter 在 Tomcat 中不生效

使用urlrewritefilter发现部分请求url报404

自定义过滤器扩展 UrlRewriteFilter 以从数据库加载规则