【发布时间】:2011-07-11 08:13:42
【问题描述】:
我有两个 Jetty AppServer 在 Apache 2.2 反向代理后面运行 Grails Web 应用程序。 SSL 终止由 apache 完成,后者将 HTTP 传递给 Jetty AppServer。
当 Grails Web 应用程序像这样进行重定向时
redirect(action:'index')
最终用户收到带有完整 URL 的 HTTP 302 重定向请求,该 URL 使用的是 http:// 协议,而不是 https://:
HTTP/1.1 302 Found
Date: Tue, 08 Mar 2011 17:50:46 GMT
Server: Jetty(6.1.17)
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Location: http://hostname.domain/web/?lang=en
这很烦人,因为所有 HTTP 请求都会被代理捕获并重定向到 HTTPS 请求。所以这是不必要的往返。
我看到了两种解决方案:
- Apache 的 mod_proxy 可以在将响应传递给用户之前将该 Location-header 重写为 https://。 (可以吗?)
- Grails 在重定向时不能使用绝对 URL:
Location: /web/?lang=en
我认为第一个选项有点愚蠢,对吧?
您知道如何让 grails 发送非绝对重定向标头(理想情况下无需切换每个重定向以使用 uri:)吗?
编辑:目前我有一个解决方法,方法是修改响应标头(a2enmod headers,然后在<Location> 中添加Header edit Location ^http://(.*)$ https://$1)。灵感来自this serverfault post。我仍然想知道为什么这首先是必要的。
【问题讨论】:
标签: grails redirect https reverse-proxy