Nginx基于标头值重写

时间:2014-08-22 00:03:24

标签: 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;
    }
}

我想配置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

1 个答案:

答案 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;
    }
}