如何让 Jetty 将 http 重定向到 https

如何让 Jetty 将 http 重定向到 https

我想使用 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 - ok,并且主体是通过 http 的页面,即重定向没有发生。

答案1

就 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.xml 中,当 Jetty 遇到 403 !SECURE 错误时,重定向到 HTTPS

<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>

答案2

我认为该模式仅匹配 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

答案3

答案4

据我所知,使用 Jetty 6 附带的任何规则/处理程序都很难做到这一点。

匹配RedirectPatternRuletarget是 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. 它不考虑请求的 URL(它总是重定向到location指定的 URL,并忽略与之匹配的任何内容pattern

您可以使用一些技巧来克服第一个问题。
您可以将 包装RewriteHandler在 中ContextHandler,上下文处理程序允许您指定它将处理来自哪些连接器的请求(setConnectorNames)。因此,您可以使用它使重写仅适用于 http 连接器上的请求。

但我想不出解决第二个问题的方法。

我认为最好的办法是为此编写自己的重定向规则。如果您没有开发资源来为您执行此操作,请联系我(您可以通过我的博客找到我的电子邮件地址,该博客位于我的个人资料中),我可以快速编写一个(使用与 Jetty 相同的许可证)。编写一条将 http 重定向到 https 的规则非常简单。

相关内容