Làm cách nào để Jetty chuyển hướng http sang https


11

Tôi muốn chuyển hướng tất cả các yêu cầu cho http sang https bằng cách sử dụng Cầu tàu (6.1.24). Vì một số lý do (sự thiếu hiểu biết của tôi), điều này đang lảng tránh tôi. Đây là những gì tôi có:

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

Để đáp lại tôi nhận được 200 - ok, và phần thân là trang trên http, tức là chuyển hướng không xảy ra.


Tôi giả sử rằng máy chủ phản hồi chính xác nếu bạn nhập thủ công url HTTPS. Bạn có thể cung cấp bất kỳ chi tiết nào từ đầu ra nhật ký và / hoặc chi tiết về những gì đang xảy ra trong trình duyệt của bạn không - trình duyệt của bạn có chuyển hướng được không? Nếu vậy bạn đã nhập URL nào và URL nào đã chuyển hướng bạn đến?
Tim

Có, máy chủ phản hồi chính xác với yêu cầu https. Tôi đã tìm ra lý do tại sao tôi nhận được 502 trước đây, tôi đã nhận xét người nghe của Jetty trên 8080 ...
Noel Kennedy

Câu trả lời:


6

Phát biểu cho Cầu tàu 9 ... Đây là cách bạn có thể làm với điều kiện trình kết nối SSL của bạn đã hoạt động:

Bước 1: Đảm bảo mọi thứ đều thông qua SSL bằng cách thêm phần này vào tệp web.xml của bạn. Nếu bạn cố truy cập tài nguyên qua HTTP, điều này sẽ trả về lỗi 403! AN TOÀN

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

Bước 2: Yêu cầu Jetty chuyển hướng đến HTTPS khi thấy lỗi 403! AN TOÀN bằng cách thêm phần này vào tệp jetty.xml của bạ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

Tôi nghĩ rằng mô hình chỉ khớp với URI. Bạn nên sử dụng một cái gì đó như:

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

Xem: http://doad.eclipse.org/jetty/urdy-7/apidocs/org/eclipse/jetty/rewrite/handler/RewriteHandler.html


kể từ Jetty9, liên kết phải là eclipse.org/jetty/documentation/civerse/rewrite-handler.html
foo

1

1
Chào mừng bạn đến với Lỗi Máy chủ! Nói chung, chúng tôi thích câu trả lời trên trang web để có thể tự đứng vững - Liên kết rất tuyệt, nhưng nếu liên kết đó bị hỏng, câu trả lời sẽ có đủ thông tin để vẫn hữu ích. Vui lòng xem xét chỉnh sửa câu trả lời của bạn để bao gồm chi tiết hơn.
voretaq7

0

Theo như tôi có thể nói, điều này không dễ thực hiện với bất kỳ quy tắc / trình xử lý nào được vận chuyển với Cầu tàu 6.

Các RedirectPatternRulekết quả khớp trên targetđường dẫn trong máy chủ Jetty và không phải là URI đầy đủ, vì vậy quy tắc của bạn không bao giờ khớp.

Bạn có thể thay đổi nó thành:

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

Tuy nhiên, điều đó có 2 vấn đề:

  1. Nó sẽ chuyển hướng tất cả các yêu cầu (thậm chí httpsyêu cầu)
  2. Nó không đưa URL được yêu cầu vào tài khoản (nó luôn chuyển hướng locationtheo như được chỉ định và bỏ qua mọi thứ được khớp bởi pattern)

Bạn có thể khắc phục vấn đề đầu tiên với một số mánh khóe.
Bạn có thể gói RewriteHandlertrong a ContextHandlervà trình xử lý ngữ cảnh cho phép bạn chỉ định trình kết nối nào sẽ xử lý các yêu cầu từ ( setConnectorNames). Vì vậy, bạn có thể sử dụng điều đó để viết lại chỉ áp dụng cho các yêu cầu trên (các) trình kết nối http.

Tôi không thể nghĩ ra cách khắc phục vấn đề thứ hai.

Tôi nghĩ rằng đặt cược tốt nhất của bạn sẽ viết quy tắc chuyển hướng của riêng bạn cho việc này. Nếu bạn không có tài nguyên phát triển để làm điều đó cho bạn, thì hãy liên hệ với tôi (bạn có thể tìm địa chỉ email của tôi qua blog của tôi, trong hồ sơ của tôi) và tôi có thể lấy một tài khoản (theo cùng giấy phép với Jetty). Sẽ rất dễ dàng để viết một quy tắc chỉ đơn giản là chuyển hướng http sang https.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.