Como fazer com que o Jetty redirecione http para https

10

Eu quero redirecionar todas as solicitações de http para https usando o Jetty (6.1.24). Por alguma razão (minha ignorância) isso está me iludindo. Isso é o que eu tenho:

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

Em resposta recebo 200 - ok, e o corpo é a página sobre http, ou seja, o redirecionamento não ocorre.

    
por Noel Kennedy 08.03.2012 / 15:37

4 respostas

6

Falando no Jetty 9 ... Veja como você pode fazer isso, desde que o seu conector SSL já esteja funcionando:

Etapa 1: Certifique-se de que tudo passe pelo SSL, adicionando isso ao seu web.xml. Se você tentar acessar um recurso via HTTP, isso retornará um erro 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>

Etapa 2: redirecione o Jetty para HTTPS quando vir um erro 403! SECURE adicionando isso ao seu 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>
    
por 12.02.2014 / 19:59
4

Acho que o padrão é compatível apenas com o URI. Você deveria usar algo como:

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

Veja: link

    
por 12.03.2012 / 17:48
1

Acabei de adicionar o documento: link

    
por 11.07.2012 / 06:58
0

Tanto quanto eu posso dizer, isso não é fácil de fazer com qualquer uma das regras / manipuladores que são enviados com o Jetty 6.

O RedirectPatternRule corresponde ao target , que é o caminho no servidor do Jetty, e não ao URI completo, portanto, sua regra nunca é correspondente.

Você pode alterá-lo para:

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

No entanto, isso tem dois problemas:

  1. Ele redirecionará todas as solicitações (até https requests)
  2. Ele não leva em conta o URL solicitado (ele sempre redireciona para location , conforme especificado, e ignora tudo o que foi correspondido pelo pattern )

Você pode superar o primeiro problema com alguns truques.
Você pode agrupar o RewriteHandler em um ContextHandler e um manipulador de contexto permite que você especifique quais conectores ele manipulará solicitações de ( setConnectorNames ). Então, você poderia usar isso para fazer a reescrita se aplicar apenas a solicitações no (s) conector (es) http (s).

Não consigo pensar em uma maneira de superar o segundo problema.

Acho que sua melhor aposta será escrever sua própria regra de redirecionamento para isso. Se você não tem recursos de desenvolvimento para fazer isso por você, entre em contato comigo (você pode encontrar meu endereço de e-mail através do meu blog, que está no meu perfil) e posso agitar um (sob a mesma licença do Jetty). Será bastante simples escrever uma regra que simplesmente redirecione http para https.

    
por 13.03.2012 / 07:17

Tags