Как заставить 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! 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
Добро пожаловать в сбой сервера! Как правило, нам нравятся ответы на сайте, чтобы они могли стоять сами по себе - Ссылки - это здорово, но если эта ссылка когда-либо разорвется, в ответе должно быть достаточно информации, чтобы она оставалась полезной. Пожалуйста, рассмотрите возможность редактирования своего ответа, чтобы включить больше деталей.
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.