96

我正在使用 nginx 作为反向代理,并尝试从上游服务器(Apache)的响应中读取自定义标头,但没有成功。Apache 响应如下:

HTTP/1.0 200 OK
Date: Fri, 14 Sep 2012 20:18:29 GMT 
Server: Apache/2.2.17 (Ubuntu)
X-Powered-By: PHP/5.3.5-1ubuntu7.10
Connection: close
Content-Type: application/json; charset=UTF-8
My-custom-header: 1

我想从My-custom-header中读取值并在 if 子句中使用它:

location / {
    // ...
    // get My-custom-header value here
    // ...
}

这可能吗?提前致谢。

4

4 回答 4

108

这不仅可能,而且很容易:

在 nginx 中,响应标头值可通过变量(每个标头一个)获得。有关这些变量的详细信息,请参阅http://wiki.nginx.org/HttpCoreModule#.24sent_http_HEADER

在您的示例中,变量将是 $sent_http_My_custom_header。

于 2012-09-14T20:43:05.683 回答
60

我面临着同样的问题。我都尝试了$http_my_custom_header$sent_http_my_custom_header但它对我不起作用。

虽然通过使用解决了这个问题$upstream_http_my_custom_header

于 2015-06-16T22:14:45.743 回答
20

使用 NGINX 作为代理时,有组标头:

  • client -> nginx: 客户端请求
  • nginx -> upstream: 上游请求
  • upstream -> nginx:上游响应标头
  • nginx -> client: 客户端响应

您似乎在询问上游响应标头。这些都在variables中找到。$upstream_http_name

但是,请注意,任何响应标头仅在收到上游服务器响应的标头后才设置。任何if指令在发送上游请求之前运行,并且无法访问任何响应标头!换句话说,if指令在收到客户端请求之后运行,然后再发出上游请求。

如果您需要更改响应的处理方式,您可以使用map指令来设置基于响应标头的变量,然后在add_header(设置客户端响应标头)中使用这些变量,log_format或者在响应阶段(内部命名为NGX_HTTP_CONTENT_PHASENGX_HTTP_LOG_PHASE阶段)。对于更复杂的控制,您必须使用脚本插件,例如Lua 模块(例如使用header_filter_by_lua_block指令)。

要读取或设置单个标题,请使用:

类型 读取(变量) 写(指令)
客户 nginx 要求 $http_name –</td>
ngnix 上游的 要求 –</td> proxy_set_header
上游的 nginx 回复 $upstream_http_name –</td>
nginx 客户 回复 $sent_http_name add_header

proxy_NGINX 使用各种指令将某些标头从客户端请求复制到上游请求,并从上游响应复制到客户端响应,从而为您提供省略或显式包含任一方向的标头的选项。因此,如果仅在变量中找到上游响应标头,则这些标头不会专门复制到客户端响应中,并且可用变量集将包括由 NGINX 设置的任何额外标头,这些标头不存在于上游响应中。$upstream_http_name$sent_http_name

于 2021-10-12T12:17:30.860 回答
11

使用 $http_MY_CUSTOM_HEADER

你可以写一些像

set my_header $http_MY_CUSTOM_HEADER;
if($my_header != 'some-value') {
#do some thing;
}
于 2014-05-12T06:25:52.480 回答