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を入力し、どのURLにリダイレクトしましたか?
ティム

はい、サーバーはhttps要求に対して正しく応答します。私は8080で桟橋のリスナーからコメントしていたが、前に私は502を得ていた私はなぜ...アウト見つけた
ノエル・ケネディ

回答:


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

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



1

1
サーバー障害へようこそ!一般に、サイト上の回答は自分で立つことができるようにしています-リンクは素晴らしいですが、そのリンクが壊れても答えはまだ役立つのに十分な情報があるはずです。回答を編集して詳細を含めることを検討してください。
voretaq7

0

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

RedirectPatternRule上のマッチtargetあなたのルールが一致することはありませんので、突堤サーバでのパスではなく、完全なURIです。

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

<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番目の問題を克服する方法は考えられません。

このための独自のリダイレクトルールを記述することをお勧めします。あなたがそれを行うための開発リソースを持っていない場合は、私に連絡し(私のプロフィールにあるブログから私のメールアドレスを見つけることができます)、私は1つを上げることができます(Jettyと同じライセンスの下で)。httpをhttpsにリダイレクトするだけのルールを記述するのは非常に簡単です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.