Як 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 - добре, і тіло - це сторінка над http, тобто перенаправлення не відбувається.


Я припускаю, що сервер відповідає правильно, якщо ви вручну ввели URL-адресу HTTPS. Чи можете ви надати якісь деталі з виводу журналу приструнів та / або деталей того, що відбувається у вашому браузері - чи ваш браузер взагалі отримує переспрямування? Якщо так, в яку URL-адресу ви ввели і на яку URL-адресу він перенаправив вас?
Тім

Так, відповідь сервера правильно на https-запит. Я дізнався, чому я отримував 502 раніше, я прокоментував слухача Jetty на 8080 ...
Ноель Кеннеді

Відповіді:


6

Виступаючи за Jetty 9 ... Ось як це можна зробити за умови, що ваш SSL-роз'єм вже працює:

Крок 1. Переконайтесь, що все проходить через SSL, додавши це у свій web.xml. Якщо ви спробуєте отримати доступ до ресурсу через HTTP, це поверне помилку 403!

<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

1
Ласкаво просимо до помилки сервера! Як правило, нам подобаються відповіді на сайті, щоб мати можливість самостійно стояти - Посилання чудові, але якщо це посилання коли-небудь перерветься, відповідь повинна мати достатньо інформації, щоб вона все-таки була корисною. Будь ласка, подумайте про редагування своєї відповіді, щоб включити більше деталей.
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в ContextHandler, а обробник контексту дозволяє вказувати, які з’єднувачі будуть обробляти запити ( setConnectorNames). Отже, ви можете використовувати це для того, щоб переписати застосувати лише запити на http-з'єднувачах.

Я не можу придумати спосіб подолання другого питання.

Я думаю, що найкраще буде створити власне правило переадресації для цього. Якщо у вас немає ресурсів розвитку, щоб зробити це для вас, тоді зв’яжіться зі мною (ви можете знайти мою електронну адресу через мій блог, який є в моєму профілі), і я можу перенести його (за тією ж ліцензією, що і Jetty). Буде досить прямо вперед написати правило, яке просто перенаправляє http на https.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.