2010-08-02 9 views
7

SSL로 리디렉션하기 위해 UrlRewriteFilter를 사용하고 있습니다. GlassFish2를 실행 중입니다.UrlRewriteFilter https에 직접

내 규칙은 다음과 같습니다. 그것은 내 war 폴더의 WEB-INF에있는 내 urlrewrite.xml에 있습니다. 다른 글래스 피 (glassfish) 설정이 필요합니까?

<rule> 
     <condition name="host" operator="notequal">https://abc.def.com</condition> 
    <condition name="host" operator="notequal">^$</condition> 
    <from>^/(.*)</from> 
    <to type="permanent-redirect" last="true">https://abc.def.com/ghi/$1</to> 
    </rule> 

하지만 FF는 URL 리디렉션 규칙이 결코 완료되지 않을 것이라고 말합니다. 나는 정확히 여기서 무슨 일이 일어나고 있는지 확신하지 못한다. 어떤 아이디어?

답변

11

내가 비교할 값인 host 헤더의 값에 비교 값이있는 리소스에 액세스하는 데 사용 된 구성표가 포함되어 있지 않은 것으로 의심됩니다. 이는 조건이 항상 true라는 것을 의미합니다. 호스트가 비교 대상과 같지 않아 무한 리디렉션 루프가 발생하기 때문입니다. UrlRewriteFilter에 대한 설명서를 보면

, 당신은 당신이 원하는 것을 얻기 위해 이런 일을 할 수 있어야한다 :

<rule> 
    <condition type="scheme" operator="notequal">https</condition> 
    <condition name="host" operator="equal">abc.def.com</condition> 
    <from>^/(.*)</from> 
    <to type="permanent-redirect" last="true">https://abc.def.com/ghi/$1</to> 
</rule> 
+0

감사합니다. Tim & Vineet. 규칙에서 빠진 계획은 문제 였고 이제는 올바르게 리디렉션됩니다. – adi

+0

첫 번째 조건에서 유형에 대한 구성표를 사용하면 나에게 적합하지 않았습니다. 나는 이것을 대신 사용했다 : ^HTTPS $ ninjasense

0

계획을 포함 할 수 없습니다 규칙을 재 작성 URL에 지정된 호스트 이름의 값. UrlRewriteFilter는 내부적으로 Servlet API 메소드를 사용하여 request.getServerName()을 통해 호스트 이름을 결정합니다. 이 메서드 호출은 결코 스키마를 반환하지 않으므로 별도로 (Tim이 암시 한 것처럼) 스키마 유효성 검사를 수행하는 것이 좋습니다.

다른 방법을 사용할 수있는 것으로 확인되면 체계가 UrlRewriteFilter를 통해 별도로 노출되는 API의 request.getScheme() 메서드를 통해서만 사용할 수 있기 때문에 체계 유효성 검사를 별도로 수행해야합니다.

FF가 리디렉션에서 오류를보고하는 실제 이유는 원래 요청 (및 클라이언트가 요청한 후속 요청)에 대해 여러 개의 302가 클라이언트에 다시 전송되기 때문일 수 있습니다. HTTP 트래픽을 모니터링하여 HTTPS 리디렉션이 실패 할 때 응용 프로그램의 실제 동작 원인에 대한 규칙이 있는지 확인할 수 있습니다.

편집 :

가능하다면, 당신은 서블릿 컨테이너의 힘 모든 HTTP 요청은 SSL을 통해 만들 수 있도록 web.xml의 기밀 transport guarantee 요소의 사용을 조사 할 수 있습니다.

0

내가 위의 예를 잘못이 무엇인지 정확히 모르겠지만,이 쉽게 OCPsoft 재 작성을 사용하여, 다른 오픈 소스 URLRewriteFilter를 해결할 수있는 그 아름다운 문제 중 하나입니다

@Override 
public Configuration getConfiguration(final ServletContext context) 
{ 

    return ConfigurationBuilder.begin() 
    .defineRule() 

    .when(Direction.isInbound() 
     .and(Domain.matches("abc.def.com")) 
     .and(Path.matches("/{path}").where("path").matches(".*")) 
     .andNot(Scheme.matches("https")) 
    .perform(Redirect.to("https://abc.def.com/{path}")); 

} 

Scheme 객체 재 작성 버전 1.0.1부터 사용 가능 : http://ocpsoft.org/rewrite/

관련 문제