태그 보관물: jetty

jetty

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로 리디렉션하는 규칙을 작성하는 것은 매우 간단합니다.


답변