我们有一个Grails Web应用程序,在Apache2后面的tomcat7中运行。通过将ProxyPass与ajp协议配合使用,一切都可以正常工作:
ProxyPass / ajp://localhost:9013/ ProxyPassreverse / ajp://localhost:9013/
其中9013是我们在tomcat’s中的AJP端口server.xml。
server.xml
现在,我们的问题是这个。我们的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和端口)访问应用程序时,所有内容都可以100%运行。但是,一旦我们通过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。谢谢
免责声明,我不是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连接器配置,则可能会给我们带来更多线索。