一尘不染

切换到HTTPS时出现Grails + Tomcat + Apache错误

tomcat

我们有一个Grails Web应用程序,在Apache2后面的tomcat7中运行。通过将ProxyPass与ajp协议配合使用,一切都可以正常工作:

ProxyPass         / ajp://localhost:9013/
ProxyPassreverse  / ajp://localhost:9013/

其中9013是我们在tomcat’s中的AJP端口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。谢谢


阅读 177

收藏
2020-06-16

共1个答案

一尘不染

免责声明,我不是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连接器配置,则可能会给我们带来更多线索。

2020-06-16