Я хочу перенаправить все запросы с 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, т.е. перенаправления не происходит.
Говоря о 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>
Я думаю, что шаблон соответствует только 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://wiki.eclipse.org/Jetty/Howto/Configure_SSL#Redirecting_http_requests_to_https
Насколько я могу судить, это непросто сделать с какими-либо правилами / обработчиками, которые поставляются с 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 проблемы:
https
Запросы)location
как указано, и игнорирует все, что было найдено pattern
)Вы можете решить первую проблему с помощью некоторых уловок.
Вы можете обернуть RewriteHandler
в ContextHandler
, а обработчик контекста позволяет указать, какие соединители будут обрабатывать запросы от (setConnectorNames
). Таким образом, вы можете использовать это, чтобы перезапись применялась только к запросам на соединителях http.
Однако я не могу придумать способ преодолеть вторую проблему.
Думаю, вам лучше всего будет написать для этого собственное правило перенаправления. Если у вас нет ресурсов для разработки, чтобы сделать это за вас, свяжитесь со мной (вы можете найти мой адрес электронной почты в моем блоге, который находится в моем профиле), и я могу создать его (по той же лицензии, что и Jetty). Будет довольно просто написать правило, которое просто перенаправляет http на https.