Tôi đang cố gắng chuyển đổi một proxy ngược bằng cách sử dụng một thiết lập mod_rewrite thú vị của Apache để sử dụng Nginx thay vào đó (do những lo ngại bên ngoài, chúng tôi đang chuyển từ Apache sang Nginx và hầu hết mọi thứ đều hoạt động tốt, ngoại trừ phần này).
Thiết lập ban đầu của tôi là đọc một cookie HTTP (được thiết lập bởi một số ứng dụng) và tùy thuộc vào giá trị của nó, hướng proxy ngược tới các phụ trợ khác nhau. Nó đã đi một cái gì đó như thế này:
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]
Tôi đang cố gắng đạt được điều tương tự bằng Nginx và cấu hình ban đầu của tôi là như thế này (trong đó "proxy_override" là tên của cookie):
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;
}
Nhưng nó đã không. Tôi đã thử xem Nginx có thể đọc cookie của tôi không bằng cách viết proxy chính để chuyển hướng đến một cái gì đó dựa trên ${cookie_proxy_override}
và tôi có thể thấy rằng nó đọc nội dung tốt, nhưng if
dường như luôn thất bại.
Lần thử tiếp theo của tôi, theo câu trả lời của Rikih là:
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;
}
Và bây giờ tôi có thể thấy rằng if
khối được kích hoạt, nhưng thay vì ủy quyền yêu cầu (như tôi nghĩ nó sẽ làm), nó trả về một chuyển hướng 302 đến URL được chỉ định - đó không phải là điều tôi đang cố gắng: Tôi cần máy chủ để chuyển tiếp yêu cầu một cách minh bạch đến các phụ trợ và chuyển phản hồi đến máy khách ban đầu.
Tôi đang làm gì sai?
if
) và tôi đã triển khai nó. Mặc dù có một vấn đề - Nginx (ít nhất là phiên bản của tôi: 1.0.0) không thích chụp ảnh được đánh sốmap
, vì vậy tôi phải sử dụng~^(?P<name>[\w-]+) $name;
thay thế. Tôi đã chỉnh sửa câu trả lời của bạn cho phù hợp.