Nginx를 대신 사용하기 위해 흥미로운 Apache mod_rewrite 설정을 사용하여 리버스 프록시를 변환하려고합니다 (외부 우려 때문에 Apache에서 Nginx로 이동하고 있으며이 부분을 제외한 모든 것이 잘 작동합니다).
내 원래 설정은 HTTP 쿠키 (일부 응용 프로그램에서 설정)를 읽고 그 값에 따라 역방향 프록시를 다른 백엔드로 보냅니다. 그것은 다음과 같이 갔다 :
RewriteCond %{HTTP_COOKIE} proxy-target-A
RewriteRule ^/original-request/ http://backend-a/some-application [P,QSA]
RewriteCond %{HTTP_COOKIE} proxy-target-B
RewriteRule ^/original-request http://backend-b/another-application [P,QSA]
RewriteRule ^/original-request http://primary-backend/original-application [P,QSA]
Nginx를 사용하여 동일한 결과를 얻으려고하는데 초기 구성은 다음과 같습니다 (여기서 "proxy_override"는 쿠키의 이름입니다).
location /original-request {
if ($cookie_proxy_override = "proxy-target-A") {
rewrite . http://backend-a/some-application;
break;
}
if ($cookie_proxy_override = "proxy-target-B") {
rewrite . http://backend-b/another-application;
break;
}
proxy_pass http://primary-backend/original-application;
}
그러나 그렇지 않았습니다. Nginx가 기본 프록시를 작성하여 쿠키를 기반으로 무언가를 리디렉션하여 쿠키를 읽을 수 있는지 확인하려고 시도했지만 쿠키가 ${cookie_proxy_override}
내용을 잘 읽지 만 if
항상 실패하는 것처럼 보입니다.
Rikih의 대답에 따르면 다음 시도는 다음과 같습니다.
location /original-request {
if ($http_cookie ~ "proxy-target-A") {
rewrite . http://backend-a/some-application;
break;
}
if ($http_cookie ~ "proxy-target-B") {
rewrite . http://backend-b/another-application;
break;
}
proxy_pass http://primary-backend/original-application;
}
이제 if
블록이 활성화 된 것을 볼 수 있지만 요청을 프록시 처리하는 대신 지정된 URL로 302 리디렉션을 반환합니다. 이것은 내가하려는 것이 아닙니다. 서버가 필요합니다. 백엔드에 요청을 투명하게 릴레이하고 원래 클라이언트에 응답을 파이프합니다.
내가 무엇을 잘못하고 있지?
if
) 구현했습니다. Nginx (적어도 내 버전 : 1.0.0)는의 번호 매기기 캡처를 좋아하지 않으므로 한 가지 문제map
가 있습니다~^(?P<name>[\w-]+) $name;
. 그에 따라 답변을 편집했습니다.