Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache Grails在部署到代理之后时生成正确的链接_Apache_Tomcat_Grails_Https - Fatal编程技术网

Apache Grails在部署到代理之后时生成正确的链接

Apache Grails在部署到代理之后时生成正确的链接,apache,tomcat,grails,https,Apache,Tomcat,Grails,Https,考虑以下已部署Grails应用程序的设置 Grails应用程序部署在Tomcat服务器(tomcat7)上 在Tomcat前面部署了一个Apache Web服务器 Apache进行SSL卸载,并充当Tomcat的代理 到目前为止,这是一个相当标准的设置,我已经成功地使用了很多次。我现在的问题是Grails应用程序生成的链接,特别是那些重定向(标准控制器重定向,总是发生在成功发布表单之后) 到目前为止,一种配置与所有其他应用程序不同:在这个Grails应用程序中,没有配置serverURL。该

考虑以下已部署Grails应用程序的设置

  • Grails应用程序部署在Tomcat服务器(tomcat7)上
  • 在Tomcat前面部署了一个Apache Web服务器
  • Apache进行SSL卸载,并充当Tomcat的代理
到目前为止,这是一个相当标准的设置,我已经成功地使用了很多次。我现在的问题是Grails应用程序生成的链接,特别是那些重定向(标准控制器重定向,总是发生在成功发布表单之后)

到目前为止,一种配置与所有其他应用程序不同:在这个Grails应用程序中,没有配置serverURL。该应用程序是一个多租户应用程序,其中每个租户都有自己的子域。(因此,如果应用程序通常在下运行,租户可以使用。)子域是自动设置的,即没有DNS或Apache级别的任何配置。Grails可以完美地做到这一点,在Config.groovy中省略serverURL属性:然后通过检查客户机主机解析所有url

但是:当生成重定向url时,Grails不知道该网站正在https下运行。所有重定向url都以http开头。。。我想这并不奇怪,因为在配置它的应用程序中,我们没有使用https:没有serverURL配置,而且从技术上讲,应用程序运行在Tomcat的标准http端口上,因为Apache提供了SSL卸载和代理

所以,底线是:我能做些什么使Grails生成正确的重定向

我已尝试扩展DefaultLinkGenerator并重写makeServerURL()方法。像这样:

class MyLinkGenerator extends DefaultLinkGenerator {

MyLinkGenerator(String serverBaseURL, String contextPath) {
    super(serverBaseURL, contextPath)
}

MyLinkGenerator(String serverBaseURL) {
    super(serverBaseURL)
}

def grailsApplication

/**
 * @return serverURL adapted to deployed scheme
 */
String makeServerURL() {
    // get configured protocol
    def scheme = grailsApplication.config.grails.twt.baseProtocol ?: 'https://'
    println "Application running under protocol $scheme"

    // get url from super
    String surl = super.makeServerURL()
    println "> super.makeServerURL(): $surl"
    if (surl) {
        // if super url not matching scheme, change scheme
        if (scheme=='https://' && surl?.startsWith('http://')) {
            surl = scheme + surl?.substring(7)
            println "> re-written: $surl"
        }
    }

    return surl

}

}
(也许不是最漂亮的代码,但我希望它能解释我想做什么。我还遗漏了在resources.groovy中配置这个类的部分。)

运行此代码时,会发生奇怪的事情:

  • 在日志中,您可以看到正在执行的代码,以及正在生成的更改url(http>https),但是
  • 发送到浏览器的重定向是未更改的url(http)
  • 更糟糕的是:生成的视图中的所有资源都被破坏了:它们现在都以//(所以应该是相对的“/css/myapp.css”现在是“//css/myapp.css”)
任何帮助或见解都将不胜感激


顺便说一句,Grails版本是2.1.1(在升级方面有点落后…。

您似乎总是在与外部世界谈论https,所以您最干净的选择是在Apache Web服务器上解决它起源的问题。添加到httpd.conf
标题编辑位置^http://(.*)$https://$1
,就完成了


如果您有一些限制迫使您在应用程序中解决这个问题,那么您可以在Grails after interceptor中重写
Location
头字段。该解决方案的详细信息在中。

自编写此问题以来,几年过去了,但问题仍然相同或至少相似;-)

以防有人遇到相同/类似的问题(Grails重定向URL是http而不是https
)。。。在OpenShift上运行的Grails 3.3.9应用程序出现了这个问题。该应用程序在HTTP模式下运行(在端口8080上),OpenShift Loadbalancer正在执行SSL终止

我们把它解决了

server:
  use-forward-headers: true
进入我们的
应用程序.yml
。在这之后,Grails工作得非常完美,并且使用
https://
创建的所有重定向都是正确的


提示:我们没有在配置中使用
grails.serverURL
,顺便说一句:LinkGenerator代码的灵感来自于这个小grails项目:伟大的解决方案:非常有魅力!“Header”指令取决于mod Header,因此它必须包含在apache配置中。