添加 HTTPS 支持会导致循环重定向

Posted

技术标签:

【中文标题】添加 HTTPS 支持会导致循环重定向【英文标题】:Adding HTTPS support causes loop redirection 【发布时间】:2013-01-03 07:18:23 【问题描述】:

我在 web 应用程序中使用 Spring Secutiry 框架。我已经安装了 SSL 证书并且能够通过https 访问我的应用程序。 现在,当我将requires-channel="https" 属性添加到所有intercept-url 指令时,服务器响应:

Error 310 (net::ERR_TOO_MANY_REDIRECTS) to many connections

spring 每次都运行这段代码:

64050 [http-bio-8080-exec-1] DEBUG org.springframework.security.web.FilterChainProxy  - / at position 1 of 12 in additional filter chain; firing Filter: 'ChannelProcessingFilter'
64050 [http-bio-8080-exec-1] DEBUG org.springframework.security.web.util.AntPathRequestMatcher  - Checking match of request : '/'; against '/'
64050 [http-bio-8080-exec-1] DEBUG org.springframework.security.web.access.channel.ChannelProcessingFilter  - Request: FilterInvocation: URL: /; ConfigAttributes: [REQUIRES_SECURE_CHANNEL]
64050 [http-bio-8080-exec-1] DEBUG org.springframework.security.web.access.channel.RetryWithHttpsEntryPoint  - Redirecting to: https://sky-handling.ejl-group.com/
64050 [http-bio-8080-exec-1] DEBUG org.springframework.security.web.DefaultRedirectStrategy  - Redirecting to 'https://sub.domain.com/'

我该如何解决?

谢谢

UPD #1:

<http use-expressions="true">
  <form-login login-page="/wellcome/" login-processing-url="/login" default-target-url="/" always-use-default-target="false"
            authentication-failure-url="/wellcome/?error=1" username-parameter="email" password-parameter="password" />
  <remember-me key="temp" token-validity-seconds="-1" />
  <logout invalidate-session="true" logout-success-url="/" logout-url="/logout"/>
  <intercept-url pattern="/" access="authenticated"/>
  <intercept-url pattern="/administration/**" access="authenticated"/>
  <intercept-url pattern="/wellcome/" access="permitAll"/>
  <intercept-url pattern="/login" access="permitAll"/>
  <custom-filter ref="ajaxTimeoutRedirectFilter" after="EXCEPTION_TRANSLATION_FILTER"/>
</http>

我将现有证书导入到密钥库并配置了 tomcat,但如果我添加这样的行:

<VirtualHost _default_:443>
        SSLEngine on
        SSLCertificateFile /usr/local/ssl/crt/public.crt
        SSLCertificateKeyFile /usr/local/ssl/private/*.ejl-group.com.key
        SSLCACertificateFile /usr/local/ssl/crt/intermediate.crt
        ServerName sub.domain.com
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>
        ProxyPass / http://localhost:8443/
        ProxyPassReverse / http://localhost:8443/
</VirtualHost>

失败并出现503 Service Temporarily Unavailable 错误

【问题讨论】:

显示您的安全配置。 【参考方案1】:

我通过在 security.xml 文件中添加端口映射来解决此问题:

<http>
   <port-mappings>
        <port-mapping http="8088" https="8443"/>
        <port-mapping http="80" https="443"/>
   </port-mappings>
</http>

这个博客帮助了我:http://consultingblogs.emc.com/richardtiffin/archive/2010/10/15/applying-ssl-to-a-spring-web-application-on-tomcat.aspx

如果你在负载均衡器后面,你必须添加一些代码:Offloading https to load balancers with Spring Security

【讨论】:

【参考方案2】:

我认为这两行是关键:

    ProxyPass / http://localhost:8443/
    ProxyPassReverse / http://localhost:8443/

请注意,您在此处指定 http,而不是 https。所以发生的事情是,当客户端通过默认的 HTTPS 端口(443)访问您的网站时,httpd 使用 http 方案将请求转发到 tomcat 实例。然后,tomcat 尝试重定向到 HTTPS/443 端口,然后 httpd 通过使用 http 方案等方式将请求转发到 tomcat 实例。

如果你只是将sceme更改为https,我不确定它是否会起作用,但试一试。

虽然我不了解您的安全要求,但通常没有必要在 httpd 前端和 tomcat 后端之间建立受 SSL 保护的链接。考虑在这里使用简单的 HTTP,甚至可能是 AJP

【讨论】:

以上是关于添加 HTTPS 支持会导致循环重定向的主要内容,如果未能解决你的问题,请参考以下文章

重定向到子域会导致重定向循环错误

Laravel 重定向返回导致重定向循环

URL 重定向导致循环

Laravel 路由组导致重定向循环

在表达式引擎重定向循环上强制使用 HTTPS

cas单点登录出现的重定向循环问题解决方案