İskele http'yi https'ye nasıl yönlendirirsiniz?


11

Jetty (6.1.24) kullanarak tüm http isteklerini https'ye yönlendirmek istiyorum. Nedense (cehaletim) bu beni kaçırıyor. Sahip olduğum şey bu:

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

Yanıt olarak 200 - tamam alıyorum ve gövde http üzerinden sayfadır, yani yönlendirme gerçekleşmez.


Manuel olarak bir HTTPS URL'si girerseniz sunucunun doğru yanıt verdiğini varsayıyorum. İskele günlük çıktısından ve / veya tarayıcınızda neler olduğuna dair herhangi bir ayrıntı sağlayabilir misiniz - tarayıcınız hiç bir yönlendirme alıyor mu? Öyleyse hangi URL'yi girdiniz ve hangi URL'ye yönlendirdiniz?
Tim

Evet, https isteğine doğru sunucu yanıtı. Neden daha önce 502 aldığımı öğrendim, Jetty'nin dinleyicisini 8080'de yorumlamıştım ...
Noel Kennedy

Yanıtlar:


6

Jetty 9 için konuşma ... SSL bağlayıcınız zaten çalışıyorsa şu şekilde yapabilirsiniz:

1. Adım: Bunu web.xml dosyasına ekleyerek her şeyin SSL üzerinden geçtiğinden emin olun. Bir kaynağa HTTP aracılığıyla erişmeye çalışırsanız, bu bir 403! SECURE hatası döndürür

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

Adım 2: Jetty.xml dosyasına ekleyerek 403! SECURE hatası gördüğünde Jetty'nin HTTPS'ye yönlendirmesini sağlayın

<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

Desenin sadece URI ile eşleştiğini düşünüyorum. Şöyle bir şey kullanmalısınız:

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

Bkz. Http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/rewrite/handler/RewriteHandler.html




0

Anlayabildiğim kadarıyla, bu İskele 6 ile gönderilen kuralların / işleyicilerin hiçbiriyle yapmak kolay değil.

RedirectPatternRuleÜzerinde maçlar targetKural eşleştirme asla yüzden, İskele sunucusunda yolu değil, tam tanım olduğunu.

Bunu şu şekilde değiştirebilirsiniz:

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

Ancak bunun 2 sorunu vardır:

  1. Tüm istekleri (hatta httpsistekler) yeniden yönlendirir
  2. İstenen URL'yi dikkate almaz (her zaman locationbelirtildiği gibi yönlendirir ve ile eşleşen her şeyi yok sayar pattern)

Bazı sorunlarla ilk sorunun üstesinden gelebilirsiniz.
İçeriği RewriteHandlera içine alabilirsiniz ContextHandlerve bir bağlam işleyicisi, hangi bağlayıcıları ( setConnectorNames) işleyeceğini belirtmenize olanak tanır . Bu nedenle, yeniden yazma işleminin yalnızca http bağlayıcılarındaki isteklere uygulanmasını sağlamak için kullanabilirsiniz.

Yine de ikinci sorunun üstesinden gelmenin bir yolunu düşünemiyorum.

Bunun için kendi yönlendirme kuralınızı yazmanızın en iyi yol olduğunu düşünüyorum. Bunu sizin için yapacak geliştirme kaynaklarınız yoksa, benimle iletişime geçin (e-posta adresimi profilimde bulunan blogum aracılığıyla bulabilirsiniz) ve birini (Jetty ile aynı lisans altında) çırpabilirim. Http'yi https'ye yönlendiren bir kural yazmak oldukça basit olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.