在重置请求 header 时重写 URL - nginx

Rewrite a URL while resetting a request header - nginx

我正在尝试将亲戚 URL“/A”重写为“/B”,同时还设置请求 header。 url /A 已经暴露给一些客户。 /B 本质上是 /A,Accept header 设置为 "json"。我正在尝试从上游删除 /A 支持,而只在上游添加 /B 。但我需要继续支持/A。因此问题

我能够成功重写,但是 header 没有设置。


location = /A {
   proxy_set_header Accept "json"
   rewrite /A /B;
}

location = /B {
  ... a lot of configurations here ...
  proxy_pass http://my_upstream;
}

以下对我有用,但我看到 nginx 对自己发出了一个额外的请求,这不是很酷。

location = /A {
   proxy_set_header Accept "json"
   proxy_pass http://127.0.0.1:$server_port/B;
}

location = /B {
  ... a lot of configurations here ...
  proxy_pass http://my_upstream;
}

有什么建议吗?

location = /A {
   set $accept "json";
   rewrite /A /B;
}

location = /B {
    proxy_set_header Accept $accept;
    ... a lot of configurations here ...
    proxy_pass http://my_upstream;
}
如果空字符串作为 proxy_set_header 第二个参数传递,

nginx 根本不会设置 header。如果您的请求不会被 location = /A 块捕获,$accept 变量将在 location = /B 块处具有空值。

更新

如果请求被第二个位置块捕获,上面给出的配置将清除 Accept HTTP header。如果你想保留它,你可以使用更复杂的配置:

map $accept $accept_header {
    ""       $http_accept;
    default  $accept;
}

server {

    ...

    location = /A {
        set $accept "json";
        rewrite /A /B;
    }

    location = /B {
        proxy_set_header Accept $accept_header;
        ... a lot of configurations here ...
        proxy_pass http://my_upstream;
    }

    ...

}