Nginx基于标头值重写

ost*_*lli 0 nginx

我有一个基本上看起来像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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想配置nginx,以便使用特定标头的值来重写传递给上游的url.

举例来说,假设我有一个请求/test与头Accept: application/vnd.demo.v1+json.我希望它被重定向到上游URL /v1/test,即基本上上游应用程序将收到/v1/test没有标题的请求.

同样,应将请求/test和标头Accept: application/vnd.demo.v2+json重定向到上游URL /v2/test.

这可行吗?我查看了IfIsEvil nginx模块,但那里的许多警告让我对使用它犹豫不决.

谢谢,

编辑

如果没有匹配,我想412 Precondition Failed立即从nginx 返回.

Ale*_*Ten 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;
    }
}
Run Code Online (Sandbox Code Playgroud)