Grails重定向-为什么它总是绝对的?

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请求。所以这是不必要的往返

我有两个Jetty应用服务器,在Apache2.2反向代理背后运行GrailsWeb应用程序。SSL终止由apaches完成,apaches将HTTP传递给Jetty AppServer

当GrailsWeb应用程序执行如下重定向时

redirect(action:'index')
最终用户收到一个带有完整URL的HTTP 302重定向请求,该URL使用的是HTTP://协议,而不是https://:

这很烦人,因为所有HTTP请求都会被代理捕获并重定向到HTTPS请求。所以这是不必要的往返

我看到两种解决办法:

  • Apache的mod_代理可以在将响应传递给用户之前将该位置头重写为https://格式。(可以吗?)
  • Grails在重定向时无法使用绝对URL:
    Location:/web/?lang=en
  • 我认为第一种选择有点愚蠢,对吧

    您知道如何让grails发送非绝对重定向头(理想情况下不必切换每个重定向以使用
    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