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。规则中缺少的方案是问题所在,现在它可以正确重定向。 在第一个条件中使用类型的方案对我不起作用。我用这个代替它确实有效: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的主要内容,如果未能解决你的问题,请参考以下文章
UrlRewriteFilter 在 Tomcat 中不生效