트래픽을 http로 리디렉션하는 방법

트래픽을 http로 리디렉션하는 방법

HTTPS를 실행할 수 있는 프록시 아래에 Apache 서버가 있습니다. HTTPS=on 헤더를 보내는 대신 HTTP_X_FORWARDED_PROTO=https를 보냅니다.

URL이 /user/login이 아닌 이상 https에서 http로 모든 요청을 리디렉션하는 .htaccess 규칙을 작성하고 싶습니다.

내가 생각해낸 것은 다음 줄 주위에 있습니다(무한 루프를 수행함).

RewriteCond %{HTTP:http_x_forwarded_proto} !http
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

답변1

리디렉션 규칙의 문제는 아마도 "http_" 접두사를 복제하고 있다는 것입니다. 이것은 필요하지 않습니다. 서버 앞에 역방향 프록시(예: F5 또는 nginx)가 있는 경우 헤더는 "X-Forwarded-Proto"이거나 때로는 "X-Forwarded_Proto"입니다. 다시 쓰기 규칙에서 이를 참조하려면 %{HTTP:Name-Of-Header}를 사용합니다(대소문자는 구분하지 않음).

모든 상황에서 작동하는 가장 강력한 재작성을 위해 다음과 같이 사용하십시오.

# Make sure all SSL pages for dot-com are redirected to HTTP.
RewriteCond %{SERVER_PORT} 443 [OR]
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https [OR]
RewriteCond %{HTTP:X-Forwarded_Proto} https
RewriteRule (.*) http://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond에서 헤더를 사용하는 방법에 대한 자세한 내용은Apache mod_rewrite 문서.

답변2

초기 조건의 문제는 !=http 대신 !http가 있다는 것입니다. 그러면 무한 루프가 해결될 수 있습니다.

    RewriteEngine On
    RewriteCond %{HTTP:http_x_forwarded_proto} !=http
    RewriteCond %{REQUEST_URI} !^/user/login.*
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

이는 /user/login이 아닌 모든 https 요청을 받아 http로 다시 작성해야 합니다. 하지만 이 작업을 수행하는 더 우아한 방법이 있다고 확신합니다. RewriteCond %{HTTP:http_x_forwarded_proto} !=http를 제거할 수 있으며 예를 들어 /user/login을 포함하지 않는 요청을 받아서 http로 리디렉션해야 하기 때문에 아마도 잘 작동할 것입니다.

관련 정보