2014-02-12 96 views
2

我有一個域app.mydomain.com這是一個創紀錄的公共IP映射(從屬於mysub.jelastic.dogado.eu Tomcat服務器) 我已配置SSL自定義證書所有的HTTPS請求都能很好地工作。jelastic Grails的重定向HTTP到HTTPS

所有我需要的是我的應用程序只使用HTTPS,所有的HTTP請求重定向到HTTPS, Acordingly帶彈簧安全插件(1.2.7.4,我有我的應用程序)我以這種方式配置:

grails.plugins.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true 
    grails.plugins.springsecurity.portMapper.httpPort = 8080 
    grails.plugins.springsecurity.portMapper.httpsPort = 8443 
    grails.plugins.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto' 
    grails.plugins.springsecurity.secureChannel.secureHeaderValue = 'http' 
    grails.plugins.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto' 
    grails.plugins.springsecurity.secureChannel.insecureHeaderValue = 'https' 
    grails.plugins.springsecurity.auth.forceHttps = true 
    grails.plugins.springsecurity.secureChannel.definition = [ 
      '/**':    'REQUIRES_SECURE_CHANNEL' 
    ] 

在本地主機上它工作得很好,所有的http請求都被重定向到了https,但是在jelastic nothig happend中。我嘗試了很多配置,將https端口替換爲8743/443,但結果相同。任何幫助都會有所幫助。

非常感謝, 克特林

+0

「但在彈性nothig發生。」 - 你究竟是什麼意思?重定向循環,超時或根本沒有重定向?同樣根據我的答案,請提供您的環境拓撲結構。 –

回答

1

,如果你在你的環境中的負載均衡器(或使用共享的解析器,但由於您使用的是自定義SSL證書的X轉發,原頭只設置在這種情況下不適用)。

如果您的環境中沒有負載均衡器,那就是檢查不起作用的原因 - 因爲這些標頭根本沒有設置。如果你確實有一個負載平衡器,所有對你的Tomcat的請求都將被定向到端口80(通過端口轉發重定向到8080)。其中包括髮送給https的請求(因爲在這種情況下,負載均衡器執行'SSL卸載')因此,您正在尋求Grails規則(8743和X-Forwarded-Proto)中不可能的組合方式(根據您的環境拓撲結構,這些案件或其他,但不能同時

編輯:你也應該仔細檢查你的server.xml,以確保你有這樣的:

<Connector port="8080" protocol="HTTP/1.1" 
      connectionTimeout="20000" 
      redirectPort="443" /> 

注意redirectPort值;它應該是443因爲這是將被髮送到瀏覽器進行重定向的端口 - 使用代理請求的負載平衡器(或Jelastic Shared Resolver),瀏覽器需要在端口443上請求(即使Tomcat SSL c onnector在8743上配置 - 如果適用的話),因爲代理使用標準的端口編號。 https://沒有任何端口號= 443)。

即使您正在使用獨立的Tomcat(無負載均衡器,而不是通過Jelastic Shared Resolver),那些到443的請求也會自動轉發到8743。

0

謝謝達米安,你的回答解決了這個問題。對於任何有興趣,這是配置(Config.groovy中):

production { 
    grails.app.context = "/"   
    grails.serverURL = "https://yourdomain.com" 
    grails.plugins.springsecurity.portMapper.httpPort = 80 
    grails.plugins.springsecurity.portMapper.httpsPort = 443 
    grails.plugins.springsecurity.auth.forceHttps = true 
    grails.plugins.springsecurity.secureChannel.definition = [ 
      '/**': 'REQUIRES_SECURE_CHANNEL' 
    ] 
    } 

將這個server.xml中:

<Connector port="80" protocol="HTTP/1.1" 
     connectionTimeout="20000" 
     redirectPort="443" /> 

我想,8080也適用。

打仗,部署。

+0

除非特別規定,否則通常不能在端口80上(Linux上)直接運行Tomcat - 請參閱http://stackoverflow.com/questions/10450045/why-does-tomcat-work-with-port-8080-but不詳細爲什麼80。這就是爲什麼Jelastic使用8080並將流量重定向到端口80到8080的原因(因此實際連接器在8080上,但用戶輸入的URL不需要添加端口(如:8080)。 –