web-dev-qa-db-ja.com

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上のページです。つまり、リダイレクトは発生しません。

11
Noel Kennedy

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にこれを追加して、403!SECUREエラーが発生したときにJettyを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>
6
Emre Colak

パターンは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

4
1
Kent Tong

私の知る限り、Jetty 6に同梱されているルールやハンドラーを使用するのは簡単ではありません。

RedirectPatternRuleは、完全なURIではなく、Jettyサーバーのパスであるtargetに一致するため、ルールが一致することはありません。

次のように変更できます。

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

ただし、これには2つの問題があります。

  1. すべてのリクエストをリダイレクトします(httpsリクエストも)
  2. 要求されたURLは考慮されません(指定されたとおり、常にlocationにリダイレクトされ、patternによって一致したものはすべて無視されます)

あなたはいくつかの策略で最初の問題を克服することができます。
RewriteHandlerContextHandlerでラップできます。コンテキストハンドラを使用すると、(setConnectorNames)からのリクエストを処理するコネクタを指定できます。したがって、それを使用して、httpコネクター上の要求にのみリライトを適用することができます。

しかし、2番目の問題を克服する方法は考えられません。

私はあなたの最善の策はこれのためにあなた自身のリダイレクトルールを書くことだと思います。あなたのためにそれを行うための開発リソースがない場合は、私に連絡してください(私のメールアドレスは、私のプロフィールにある私のブログから見つけることができます)、私は(Jettyと同じライセンスの下で)上げることができます。 httpをhttpsにリダイレクトするだけのルールを書くのはかなり簡単です。

0
Tim