我有一个基本上看起来像的nginx.conf(省略了不必要的部分):
upstream app {
server unix:/tmp/unicorn.myapp.sock fail_timeout=0;
}
server {
listen 80;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
}
我想配置nginx,以便使用特定标头的值来重写传递给上游的url。
例如,假设我向/test
发送了标题为Accept: application/vnd.demo.v1+json
的请求。我希望它被重定向到上游URL /v1/test
,即基本上上游应用程序将收到没有标题的请求/v1/test
。
同样,对/test
和标题Accept: application/vnd.demo.v2+json
的请求应重定向到上游网址/v2/test
。
这可行吗?我查看了IfIsEvil nginx模块,但那里的许多警告让我对使用它犹豫不决。
谢谢,
河
修改
如果没有匹配,我想立即从nginx返回412 Precondition Failed
。
答案 0 :(得分:5)
如果Accept
标头不包含必需的标头返回错误。
map $http_accept $version {
default "";
"~application/vnd\.demo\.v2\+json" "v2";
"~application/vnd\.demo\.v1\+json" "v1";
}
server {
location @app {
if ($version = "") {
return 412;
}
...;
proxy_pass http://app/$version$uri$is_args$args;
}
}