我正在尝试使用有趣的Apache mod_rewrite设置来转换反向代理以改为使用Nginx(由于外部原因,我们正从Apache迁移到Nginx,并且除此部分外,大多数其他方法都工作正常)。
我最初的设置是读取HTTP cookie(由某些应用程序设置),然后根据其值将反向代理定向到不同的后端。它是这样的:
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”是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;
}
但事实并非如此。我试图通过编写主代理来重定向到基于的东西来查看Nginx是否可以读取我的cookie ${cookie_proxy_override}
,我可以看到它读取的内容很好,但是if
s总是失败。
根据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;
。我已经相应地编辑了您的答案。