Jetty가 http를 https로 리디렉션하도록하는 방법 (6.1.24)를 사용하여

Jetty (6.1.24)를 사용하여 http에 대한 모든 요청을 https로 리디렉션하고 싶습니다. 어떤 이유로 (나의 무지) 이것이 나를 피하고 있습니다. 이것이 내가 가진 것입니다 :

<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 단계 : web.xml에 추가하여 모든 것이 SSL을 통과하는지 확인하십시오. 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.xml에 403! SECURE 오류를 추가하면 Jetty가 HTTPS로 리디렉션되도록합니다.

<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://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/rewrite/handler/RewriteHandler.html


답변


답변

내가 알 수있는 한, Jetty 6과 함께 제공되는 규칙 / 핸들러와는 쉽지 않습니다.

에 대한 RedirectPatternRule일치 target는 전체 URI가 아닌 Jetty 서버의 경로이므로 규칙이 일치하지 않습니다.

다음과 같이 변경할 수 있습니다.

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

그러나 두 가지 문제가 있습니다.

  1. 모든 요청을 리디렉션합니다 (요청조차 포함 https).
  2. 요청 된 URL을 고려하지 않습니다 ( location지정된대로 항상 리디렉션되고 와 일치하는 항목은 무시 함 pattern)

약간의 속임수로 첫 번째 문제를 극복 할 수 있습니다.
당신은 포장 할 수 RewriteHandlerA의 ContextHandler및 문맥 처리기는 당신이 (에서 요청을 처리 할 커넥터를 지정할 수 있습니다 setConnectorNames). 따라서 다시 작성하여 http 커넥터의 요청에만 적용 할 수 있습니다.

그래도 두 번째 문제를 극복하는 방법을 생각할 수 없습니다.

최선의 방법은 자신의 리디렉션 규칙을 작성하는 것입니다. 이를위한 개발 리소스가없는 경우 저에게 연락하십시오 (내 프로필에있는 내 블로그를 통해 내 전자 메일 주소를 찾을 수 있음). http를 https로 리디렉션하는 규칙을 작성하는 것은 매우 간단합니다.