RewriteRule을 사용하여 일반적으로 수행하는 매우 간단한 작업을 시도하고 있습니다.mod_rewrite를 사용하지 않고 http 트래픽을 Apache에서 https로 리디렉션
내 목표 : 특정 포스 (모든) URL은 https
프로토콜을 사용합니다.
주의 사항 :
- 아파치는 암호화-offloader 뒤에. 암호화되지 않은 트래픽과 해독 된 트래픽을 처리하는 단일 가상 호스트를 원합니다. 오프 로더는 모든 트래픽을 동일한 포트로 전달하고
X-Forwarded-Proto
헤더를 설정합니다. (나중에 호환성을 위해Forwarded
헤더를 새로 설정합니다.) - 최근에 읽은 모든 내용은
RewriteRule
대신Redirect
또는RedirectMatch
을 사용하는 것이 좋습니다. 따라서 가능하면RewriteRule
을 피하고 싶습니다. - 강제하려는 URL은 가상 호스트 내의
<LocationMatch>
섹션에 구성된 역방향 프록시입니다. - 가상 호스트가 모두 TLS 인증서에 포함 된 유효한 이름에 해당하는 여러
Alias
항목이 - 것 같다 (즉, 내가 원하지 않는/정식 이름을 사용하는 사용자를 강제로 필요)
Redirect
및RedirectMatch
그%{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를 사용하고 있습니까? 아니면 더 우아한 방법이 있습니까?