Grails重定向-为什么它总是绝对的?
我有两个Jetty应用服务器,在Apache2.2反向代理背后运行GrailsWeb应用程序。SSL终止由apaches完成,apaches将HTTP传递给Jetty AppServer 当GrailsWeb应用程序执行如下重定向时Grails重定向-为什么它总是绝对的?,grails,redirect,https,reverse-proxy,Grails,Redirect,Https,Reverse Proxy,我有两个Jetty应用服务器,在Apache2.2反向代理背后运行GrailsWeb应用程序。SSL终止由apaches完成,apaches将HTTP传递给Jetty AppServer 当GrailsWeb应用程序执行如下重定向时 redirect(action:'index') 最终用户收到一个带有完整URL的HTTP 302重定向请求,该URL使用的是HTTP://协议,而不是https://: 这很烦人,因为所有HTTP请求都会被代理捕获并重定向到HTTPS请求。所以这是不必要的往返
redirect(action:'index')
最终用户收到一个带有完整URL的HTTP 302重定向请求,该URL使用的是HTTP://协议,而不是https://:
这很烦人,因为所有HTTP请求都会被代理捕获并重定向到HTTPS请求。所以这是不必要的往返
我看到两种解决办法:
Location:/web/?lang=en
uri:
)吗
编辑:目前,我有一个解决方法,即按照第一种方法修改响应标题(a2enmod标题
,然后在
中添加标题编辑位置^http://(.*)$https://$1
)。灵感来自于。我仍然想知道为什么首先需要这样做。,而不是相对位置。即使它在某些浏览器中工作,这些浏览器也超出了规范,我相信如果您使用相对url,某些实现将无法正常工作
您看到这个问题的原因是,SSL终止发生在apache上,apache向Jetty发出普通HTTP请求。因此Jetty得到了一个普通的非HTTPS请求,因此它不知道发送HTTPS响应,而不是常规的HTTP响应。如果您在Jetty中进行SSL终止,那么就不会有问题(但是Jetty在SSL终止方面没有那么出色)
在我们的应用程序(apache/HA Proxy->Tomcat)中,我们已经处理了这个问题,通过使用每个环境配置值对响应协议进行硬编码(我们需要处理url,因为它是一个多租户系统,有许多潜在的主机名,说来话长……),但是您使用apache的解决方案也很有效。这个问题现在已经有10年的历史了。从那时起,规范已在中更新。现在允许位置标头中的相对引用: 当[位置]具有 相对引用()的形式,最终 值是通过根据有效请求URI解析来计算的 () Grails支持这种类型的重定向,但在重定向时必须应用额外的
absolute:false
参数:
redirect action: 'index', absolute: false
注意:在撰写本文时,此功能(尚未)支持servlet上下文路径,请参见正确,尽管FWIW,但我尚未看到任何浏览器无法支持相对URL。我们试图在IE7 Beta 1中停止,并在第二天恢复了该更改。:-)
redirect action: 'index', absolute: false