从http重定向到https - 无限循环

时间:2018-04-24 09:28:24

标签: java ssl https url-redirection tuckey-urlrewrite-filter

我正在处理托管在Tomcat服务器上的Java Web应用程序。我必须设置从www到非www和从http到https的重定向。我想要以下三个网址:

重定向到

为此目的,我正在使用tuckey.org的UrlRewriteFilter版本4.0.3。这是我的urlrewrite.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN" "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd"> 
<urlrewrite> 
  <rule> 
    <name>Redirect www to non-www and http to https</name> 
    <condition type="request-url" operator="equal">(^http://example.com|^http://www.example.com|^https://www.example.com)</condition> 
    <from>^(.*)$</from> 
    <to type="permanent-redirect" last="true">https://example.com$1</to> 
  </rule> 
</urlrewrite> 

重定向工作但网站未加载,浏览器显示消息:

  

此页面无效   example.com重定向了你太多次了。

我使用了重定向检查器,发现在初始重定向到https://example.com/之后,另一个重定向到https://example.com/,然后是另一个,依此类推 - 网址重定向到自身。我不明白是什么产生了这种无限循环。任何帮助将不胜感激!

更新:我还没有解决方案。如果我从条件元素中删除第一个URL,则其他两个重定向工作正常,但问题是如何设置http://example.com的重定向。

我尝试了另一种方法 - 通过粘贴以下代码在web.xml文件中设置重定向到https:

<security-constraint> 
  <web-resource-collection> 
    <web-resource-name>all</web-resource-name> 
    <url-pattern>/*</url-pattern> 
  </web-resource-collection> 
  <user-data-constraint> 
    <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
  </user-data-constraint> 
</security-constraint> 

结果相同 - https://example.com在无限循环中重定向到自身。在这种情况下,唯一的区别是重定向的状态代码为302.有关导致此问题的原因以及如何解决问题的任何想法?

更新:使用UrlRewriteFilter

时,这是curl命令的输出

运行结果:curl http://example.com

响应标头

HTTP/1.1 301 Moved Permanently   
Server: nginx admin   
Date: Fri, 04 May 2018 13:24:16 GMT   
Content-Type: text/plain   
Content-Length: 0   
Connection: keep-alive   
Location: https://example.com/   
X-Cache: HIT from Backend  

运行结果:curl https://example.com/

响应标头

HTTP/1.1 301 Moved Permanently   
Date: Fri, 04 May 2018 11:58:51 GMT   
Server: Apache-Coyote/1.1  
Location: https://example.com/   
Content-Length: 0   
Content-Type: text/plain

3 个答案:

答案 0 :(得分:4)

我会简化下面的规则

<rule>
   <name>Ensure HTTPS</name>
   <condition type="scheme" operator="notequal" next="or">https</condition>
   <condition name="host" operator="notequal">www.example.com</condition>
   <from>^/(.*)$</from>
   <to type="redirect">https://example.com/$1</to>
</rule>

还要确保证书对example.com有效,并在下面的线程中指出

UrlRewriteFilter: www and https redirect

答案 1 :(得分:1)

我对卷曲的了解可能有点过时,但我认为你必须curl -L url才能遵循重定向。

另外,您确定问题与您的客户无关吗?

答案 2 :(得分:0)

看来,来自https://example.com的回复总是低于标题:

Location: https.example.com
response Code: 301

操作和重定向是浏览器的行为。您可能需要找到一种方法来删除这些标头。希望这在某种程度上有所帮助。