Apache Grails在部署到代理之后时生成正确的链接
考虑以下已部署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应用程序部署在Tomcat服务器(tomcat7)上
- 在Tomcat前面部署了一个Apache Web服务器
- Apache进行SSL卸载,并充当Tomcat的代理
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配置中。