วิธีการเปลี่ยนเส้นทาง Jetty http เป็น https


11

ฉันต้องการเปลี่ยนเส้นทางคำขอทั้งหมดสำหรับ http ไปยัง https โดยใช้ Jetty (6.1.24) ด้วยเหตุผลบางอย่าง (ความไม่รู้ของฉัน) นี่คือการหลบหลีกฉัน นี่คือสิ่งที่ฉันมี:

<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 เช่นการเปลี่ยนเส้นทางจะไม่เกิดขึ้น


ฉันถือว่าเซิร์ฟเวอร์ตอบสนองอย่างถูกต้องหากคุณป้อน URL HTTPS ด้วยตนเอง คุณสามารถให้รายละเอียดใด ๆ จากการส่งออกท่าเทียบเรือและ / หรือรายละเอียดของสิ่งที่เกิดขึ้นในเบราว์เซอร์ของคุณ - เบราว์เซอร์ของคุณจะได้รับการเปลี่ยนเส้นทางหรือไม่? ถ้าเป็นเช่นนั้นคุณป้อน URL ใดและ URL นั้นเปลี่ยนเส้นทางคุณไปที่ใด
Tim

ใช่การตอบสนองของเซิร์ฟเวอร์อย่างถูกต้องกับการร้องขอ https ฉันพบว่าทำไมฉันถึงได้รับ 502 มาก่อนฉันได้แสดงความคิดเห็นกับผู้ฟังของ Jetty เมื่อ 8080 ...
Noel Kennedy

คำตอบ:


6

กำลังพูดกับ Jetty 9 ... ต่อไปนี้เป็นวิธีที่คุณสามารถทำได้หากตัวเชื่อมต่อ SSL ของคุณใช้งานได้แล้ว:

ขั้นตอนที่ 1:ตรวจสอบให้แน่ใจว่าทุกอย่างผ่าน SSL โดยเพิ่มสิ่งนี้ลงใน web.xml ของคุณ หากคุณพยายามเข้าถึงทรัพยากรผ่าน 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 ไปที่ HTTPS เมื่อเห็นข้อผิดพลาด 403! SECURE โดยเพิ่มสิ่งนี้ลงใน 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


ตั้งแต่ Jetty9 ลิงก์ควรเป็นeclipse.org/jetty/documentation/current/rewrite-handler.html
foo

1

ฉันเพิ่งเพิ่มเอกสาร: http://wiki.eclipse.org/Jetty/Howto/Configure_SSL#Redirecting_http_requests_to_https


1
ยินดีต้อนรับสู่ Server Fault! โดยทั่วไปเราชอบคำตอบในเว็บไซต์เพื่อให้สามารถยืนได้ด้วยตัวเอง - ลิงค์นั้นดี แต่ถ้าลิงค์นั้นเคยทำลายคำตอบควรมีข้อมูลเพียงพอที่จะยังคงเป็นประโยชน์ โปรดพิจารณาแก้ไขคำตอบของคุณเพื่อรวมรายละเอียดเพิ่มเติม
voretaq7

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>

อย่างไรก็ตามนั่นมี 2 ประเด็น:

  1. มันจะเปลี่ยนเส้นทางคำขอทั้งหมด (แม้httpsคำขอ)
  2. ไม่คำนึงถึง URL ที่ร้องขอ (มันจะเปลี่ยนเส้นทางไปlocationตามที่ระบุเสมอและจะไม่สนใจสิ่งใดก็ตามที่ตรงกับpattern)

คุณสามารถเอาชนะปัญหาแรกด้วยการใช้เล่ห์เหลี่ยมบางอย่าง
คุณสามารถตัดคำRewriteHandlerใน a ContextHandlerและตัวจัดการบริบทอนุญาตให้คุณระบุตัวเชื่อมต่อที่จะจัดการกับคำร้องขอจาก ( setConnectorNames) ดังนั้นคุณสามารถใช้สิ่งนั้นเพื่อให้การเขียนใหม่นำไปใช้กับคำขอบนตัวเชื่อมต่อ http เท่านั้น

ฉันไม่สามารถคิดวิธีที่จะเอาชนะปัญหาที่สองได้

ฉันคิดว่าทางออกที่ดีที่สุดของคุณคือการเขียนกฎการเปลี่ยนเส้นทางของคุณเอง หากคุณไม่มีทรัพยากรในการพัฒนาสำหรับคุณโปรดติดต่อฉัน (คุณสามารถค้นหาที่อยู่อีเมลของฉันผ่านบล็อกของฉันซึ่งอยู่ในโปรไฟล์ของฉัน) และฉันสามารถชักหนึ่งขึ้น (ภายใต้ใบอนุญาตเดียวกันกับท่าเทียบเรือ) มันจะค่อนข้างตรงไปตรงมาในการเขียนกฎที่เพียงแค่เปลี่ยนเส้นทาง http ไปยัง https

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.