如何让Jetty将http重定向到https


11

我想使用Jetty(6.1.24)将所有对http的请求重定向到https。由于某种原因(我的无知),这使我难以理解。这就是我所拥有的:

<New id="redirect" class="org.mortbay.jetty.handler.rewrite.RedirectPatternRule">
  <Set name="pattern">http://foobar.com/*</Set>
  <Set name="location">https://foobar.com</Set>
</New>

作为回应,我得到200-好的,正文是http上的页面,即不会发生重定向。


如果您手动输入HTTPS网址,我认为服务器可以正确响应。您能否从码头日志输出中提供任何详细信息和/或浏览器中发生的事情的详细信息-浏览器是否可以重定向?如果是,您输入了什么URL,它将您重定向到了什么URL?
2012年

是的,服务器正确响应https请求。我已经弄清楚为什么为什么要得到502,我已经注释掉了8080码头的听众...
诺埃尔·肯尼迪

Answers:


6

谈到Jetty 9 ...只要您的SSL连接器已经可以使用,就可以按照以下方法进行操作:

第1步:通过将所有内容添加到您的web.xml中,确保所有内容都通过SSL。如果您尝试通过HTTP访问资源,则将返回403!SECURE错误

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

步骤2:将 Jetty看到403!SECURE错误时将其重定向到HTTPS,方法是将此错误添加到您的jetty.xml中

<New id="tlsHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
   <Arg>
      <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
         <!-- This says... Redirect to https://host:8443 if server returns "NOT SECURE" error -->
         <Set name="secureScheme">https</Set>
         <Set name="securePort">8443</Set>
      </New>
   </Arg>
   <Call name="addCustomizer">
      <Arg>
         <New class="org.eclipse.jetty.server.SecureRequestCustomizer" />
      </Arg>
   </Call>
</New>

<!-- This is your HTTP connector, you should have another one for HTTPS -->
<New class="org.eclipse.jetty.server.ServerConnector">
   <Arg name="server">
      <Ref refid="MyServer" />
   </Arg>
   <Arg name="factories">
      <Array type="org.eclipse.jetty.server.ConnectionFactory">
         <Item>
            <New class="org.eclipse.jetty.server.HttpConnectionFactory">
               <Arg name="config">
                  <!-- defined above -->
                  <Ref refid="tlsHttpConfig" />
               </Arg>
            </New>
         </Item>
      </Array>
   </Arg>
   <Set name="host">localhost</Set>
   <Set name="port">8080</Set>
</New>

4

我认为该模式仅匹配URI。您应该使用类似:

<New id="forwardedHttps" class="org.eclipse.jetty.rewrite.handler.ForwardedSchemeHeaderRule">
           <Set name="header">X-Forwarded-Scheme</Set>
           <Set name="headerValue">https</Set>
           <Set name="scheme">https</Set>
</New>

请参阅:http : //download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/rewrite/handler/RewriteHandler.html




0

据我所知,要使用Jetty 6随附的任何规则/处理程序,这并不容易。

上的RedirectPatternRule匹配项target是Jetty服务器中的路径,而不是完整的URI,因此您的规则永远不会匹配。

您可以将其更改为:

<New id="redirect" class="org.mortbay.jetty.handler.rewrite.RedirectPatternRule">
  <Set name="pattern">/*</Set>
  <Set name="location">https://foobar.com</Set>
</New>

但是,这有两个问题:

  1. 它将重定向所有请求(甚至https请求)
  2. 它不会考虑所请求的网址(它始终会重定向到location指定的网址,并且会忽略与匹配的任何内容pattern

您可以通过一些技巧来克服第一个问题。
您可以将包裹在RewriteHandlerContextHandler,然后使用上下文处理程序来指定它将处理(setConnectorNames)请求的连接器。因此,您可以使用它来使重写仅适用于http连接器上的请求。

我想不出办法解决第二个问题。

我认为最好的办法就是为此编写自己的重定向规则。如果您没有开发资源来满足您的需要,请与我联系(您可以在我的个人资料中通过我的博客找到我的电子邮件地址),然后我可以鞭打一个(与Jetty拥有相同的许可)。编写一条直接将http重定向到https的规则将非常简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.