我们有一个Grails Web应用程序,在Apache2后面的tomcat7中运行。通过使用带有ajp协议的ProxyPass,一切正常:
ProxyPass / ajp://localhost:9013/
ProxyPassreverse / ajp://localhost:9013/
其中9013是我们在tomcat的server.xml
中的AJP端口。
现在,我们的问题是这样。我们的Grails应用程序运行HTTP和HTTPS。当进入应用程序中的某个区域时,Spring Security(Grails Spring Security Core插件)会将您从使用HTTP的地址重定向到HTTPS,例如在点击时:
http://www.example.com/secure/path
Spring Security会将您重定向到:
https://www.example.com/secure/path
但是现在,当它重定向到那里时,服务器挂起,最后Firefox给出“Firefox检测到服务器正在以永远不会完成的方式重定向该地址的请求。”错误
我是否认为使用AJP代理进行重定向会变坏?任何人都可以提供有关此设置如何工作的更多信息吗?
进一步观察,我们发现了以下内容:
当直接在tomcat中访问应用程序时(通过IP和端口),一切都可以正常工作。但是一旦我们通过Apache,Spring Security重定向就不起作用了。您将继续在Apache日志中获得以下内容:
staging.server.com:80 41.133.194.248 - - [05/Apr/2012:14:03:41 +0200] "GET /user/signup HTTP/1.1" 302 223 "http://staging.server.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0"
staging.server.com:80 41.133.194.248 - - [05/Apr/2012:14:03:42 +0200] "GET /user/signup HTTP/1.1" 302 223 "http://staging.server.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0"
staging.server.com:80 41.133.194.248 - - [05/Apr/2012:14:03:42 +0200] "GET /user/signup HTTP/1.1" 302 223 "http://staging.server.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0"
staging.server.com:80 41.133.194.248 - - [05/Apr/2012:14:03:42 +0200] "GET /user/signup HTTP/1.1" 302 223 "http://staging.server.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0"
...
而不是重定向到https似乎apache神奇地让它再次尝试http。 感谢
答案 0 :(得分:2)
虽然我无法告诉你如何解决它,但我可以告诉你问题是什么。
它基本上是重写入口点。
因此,设置在这些情况下你应该做的部分内容是:
grails.plugins.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
如果我们真的在http / https上,通过设置标题默认为:
,这将会查找RequestHeader设置X-Forwarded-Proto“http”
现在我在nginx中运行良好。在前面有apache的问题是重写规则ARENT拿起apache服务器。他们只是拿起自己。因此,当它开始时它基本上达到了无限重定向,因为它所知道的就是你所使用的9013服务器。
现在我想我要编写自己的自定义HttpsEntry,但我想有一些apache设置可以使这项工作正常。
答案 1 :(得分:1)
Grails / Spring-Security具有以下属性:
grails {
// redirect ports
plugins {
springsecurity {
portMapper {
httpPort = 80
httpsPort = 443
}
}
}
}
你可以使用来自hongo的affore的httpd-config(端口80/443,在Apache终止的SSL)。您可能还需要正确设置server.url
属性。
答案 2 :(得分:0)
不确定spring-security-core在切换到HTTPS时如何决定使用哪个端口,但默认的Tomcat配置对于AJP连接器有redirectPort =“8443”,可能需要更改为443以便重定向将命中Apache的HTTPS端口。
答案 3 :(得分:0)
免责声明,我不是Grails的专家。
但是根据您的描述,配置可能如下:
SSL被卸载到apache httpd。因此,只需要在Tomcat中配置ajp连接器,或者可能只使用额外的http连接器进行测试。 按照http://httpd.apache.org/docs/2.0/ssl/ssl_howto.html为apache httpd配置启用SSL 和
<VirtualHost _default_:80>
RedirectPermanent /secure/path https://www.example.com/secure/path
ProxyPass / ajp://localhost:8009/
ProxyPassreverse / ajp://localhost:8009/
</VirtualHost>
<VirtualHost _default_:443>
# SSL config
...
ProxyPass / ajp://localhost:8009/
ProxyPassreverse / ajp://localhost:8009/
</VirtualHost>
应该有用。
另一个好处是,当SSL卸载到apache httpd时,您可能会看到性能提升。
此外,为什么不强制使用SSL:
<VirtualHost _default_:80>
RedirectPermanent / https://www.example.com/
</VirtualHost>
<VirtualHost _default_:443>
# SSL config
...
ProxyPass / ajp://localhost:8009/
ProxyPassreverse / ajp://localhost:8009/
</VirtualHost>
至于为什么你有无限循环,它可能与Spring Security的sendRedirect有关。 如果您可以发布完整的Apache VirtualHost和tomcat ajp连接器配置,它可能会给我们更多线索。
答案 4 :(得分:0)
顺便问一下......这是你的回答。
端口映射器设置也是如此,并使用我之前所说的通道安全性。
需要通道安全性才能知道何时转发到http / https
但是在重定向内部,您需要保留代理设置,以便request.getServerPort()可以找到它们。您可以将其添加到Apache httpd.conf:
ProxyPreserveHost On