2016-10-26 2 views
0

RewriteRule을 사용하여 일반적으로 수행하는 매우 간단한 작업을 시도하고 있습니다.mod_rewrite를 사용하지 않고 http 트래픽을 Apache에서 https로 리디렉션

내 목표 : 특정 포스 (모든) URL은 https 프로토콜을 사용합니다.

주의 사항 :

  • 아파치는 암호화-offloader 뒤에. 암호화되지 않은 트래픽과 해독 된 트래픽을 처리하는 단일 가상 호스트를 원합니다. 오프 로더는 모든 트래픽을 동일한 포트로 전달하고 X-Forwarded-Proto 헤더를 설정합니다. (나중에 호환성을 위해 Forwarded 헤더를 새로 설정합니다.)
  • 최근에 읽은 모든 내용은 RewriteRule 대신 Redirect 또는 RedirectMatch을 사용하는 것이 좋습니다. 따라서 가능하면 RewriteRule을 피하고 싶습니다.
  • 강제하려는 URL은 가상 호스트 내의 <LocationMatch> 섹션에 구성된 역방향 프록시입니다.
  • 가상 호스트가 모두 TLS 인증서에 포함 된 유효한 이름에 해당하는 여러 Alias 항목이
  • 것 같다 (즉, 내가 원하지 않는/정식 이름을 사용하는 사용자를 강제로 필요) RedirectRedirectMatch%{HTTP_HOST} 서버 변수를 사용할 수 없습니다. 이것은 클라이언트 (지저분한)에 의해 사용 된 호스트에 따라 다른 RedirectMatch 라인을 가지기 위해 여분의 로직을 필요로한다는 것을 의미합니다.
  • mod_rewrite을 사용해야 할 경우 <LocationMatch> 섹션에 RewriteRule 섹션을 포함하면 한 곳에서 해당 경로/프록시의 구성을 유지할 수 있습니다. 그러나 이것은 또한 문제를 일으키는 것으로 보인다.

시간을 설명하는 데 도움이되는 몇 가지 예제 코드의 시간입니다. - RedirectMatch를 사용

<VirtualHost 192.168.0.1:80> 
    ServerName www.example.com 
    ServerAlias example.com 
    ServerAlias anothervalidalias.com 

옵션 1을 다음과 같이 다음의 모든 예제는 VirtualHost 섹션에 상주합니다. 이것은 작동하지만 호스트 이름을 강제합니다.

<LocationMatch "/backendcontextroot"> 
    ProxyPreserveHost on 
    ProxyPass "http://192.168.0.2:8080/backendcontextroot" 
    <If "-z req('X-Forwarded-Proto')"> 
     RedirectMatch ^(.*) https://www.example.com/$1 
    </If> 
</LocationMatch> 

옵션 2-RedirectMatch 사용. 이 내 이상 솔루션이 될 수 있지만 HTTP_HOST 작동하지 않습니다. 아파치는 아무 응답도 클라이언트에게 보내지 않는다.

<LocationMatch "/backendcontextroot"> 
    ProxyPreserveHost on 
    ProxyPass "http://192.168.0.2:8080/backendcontextroot" 
    <If "-z req('X-Forwarded-Proto')"> 
     RedirectMatch ^(.*) https://%{HTTP_HOST}/$1 
    </If> 
</LocationMatch> 

옵션 3 - LocationMatch 블록 내에서 RewriteRule 사용. 내가 실제로 Redirect을 사용할 수없고 RewriteRule을 사용하도록 강요한다면 /backendcontextroot 리버스 프록시를 한 곳에서 함께 구성하기 때문에 이것이 내 선호하는 방법이 될 것입니다. 그러나 이것은 '펑키'리디렉션을 생성합니다 ...- RewriteRule외부LocationMatch 블록을 사용 https://www.example.com/proxy:http://192.168.0.2:8080/backendcontextroot

옵션 4 :

<LocationMatch "/backendcontextroot"> 
    ProxyPreserveHost on 
    ProxyPass "http://192.168.0.2:8080/backendcontextroot" 
    RewriteEngine on 
    RewriteCond %{HTTP:X-Forwarded-Proto} !https 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 
</LocationMatch> 

이로 리디렉션합니다. 이것은 작동하지만이 역방향 프록시의 구성은 '확산됩니다'. 가능하다면 피해야한다는 제안에도 불구하고 RewriteRule을 사용합니다.

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteCond %{REQUEST_URI} ^/backendcontextroot 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 

<LocationMatch "/backendcontextroot"> 
    ProxyPreserveHost on 
    ProxyPass "http://192.168.0.2:8080/backendcontextroot" 
</LocationMatch> 

옵션 4를 사용하고 있습니까? 아니면 더 우아한 방법이 있습니까?

답변

0

RedirectMatch은 상대적으로 무차별 리디렉션에만 적합하므로 대부분의 요구를 충족시킵니다. 암호화 프록시를 깨끗하게 유지하고 연결이 암호화되었음을 나타내는 백엔드 요청에 헤더를 추가하거나 (이를 수행하는 방법이 확실하지 않음) 다른 포트에 연결하십시오. 8443은 같은 Listen 또는 <VirtualHost>에 추가 할 것이며 백엔드에는 8080이 있습니다. 백엔드는 여전히 암호화 된 연결을 사용하지 않지만 헤더 나 포트를 확인하여 연결이 "안전"한지 여부를 알 수 있습니다. 이러한 검사는 RewriteCond 번 (%{HTTP:X-Your-Https-Header} 또는 %{SERVER_PORT}) 또는 사이트의 스크립팅 언어에서 백엔드로 쉽게 수행 할 수 있으며 리디렉션이 필요한 URL을 알고 있기 때문에 리디렉션이 전송됩니다. https:으로 리디렉션을 완료 할 수 있으므로 클라이언트가 요청해야하므로 백엔드는 올바른 헤더/포트로 프록시 된 새 요청을 받게됩니다.

편집 : 암호화 서버 구성의 예를

<LocationMatch "/backendcontextroot"> 
    ProxyPreserveHost on 
    <If "%{HTTPS} == 'on'"> 
     ProxyPass "http://192.168.0.2:8443/backendcontextroot" 
    <Else> 
     ProxyPass "http://192.168.0.2:8080/backendcontextroot" 
    </If> 
</LocationMatch>