nginx -从上游服务器读取自定义标头

rnmwe5a2  于 2022-12-22  发布在  Nginx
关注(0)|答案(4)|浏览(253)

我正在使用nginx作为反向代理,并尝试从上游服务器(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
    // ...
}

这可能吗?

6za6bjd0

6za6bjd01#

这不仅是可能的,而且很容易:
在nginx中,响应头的值是通过一个变量(每个头一个)获得的。2http://wiki.nginx.org/HttpCoreModule#.24sent_http_HEADER关于这些变量的详细信息,请参见www.example.com。
在您的示例中,变量将是$sent_http_My_custom_header。

enyaitl3

enyaitl32#

我也遇到了同样的问题,我试过$http_my_custom_header$sent_http_my_custom_header,但对我不起作用。
虽然使用$upstream_http_my_custom_header解决了这个问题。

imzjd6km

imzjd6km3#

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

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

您似乎在询问上游响应头,它们可以在$upstream_http_name``变量中找到。

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

如果需要更改响应的处理方式,可以使用map directive但是根据响应头设置变量,然后在add_header中使用这些变量(设置客户端响应报头),log_format或任何其他在响应阶段处于活动状态的指令(内部命名为NGX_HTTP_CONTENT_PHASENGX_HTTP_LOG_PHASE阶段)。对于更复杂的控制,您必须使用脚本插件,如Lua module(例如使用header_filter_by_lua_block指令)。
要读取或设置单个标头,请使用:
| 从|到|类型|读取(变量)|写入(指令)|
| - ------| - ------| - ------| - ------| - ------|
| 委托人|恩金斯|请求|$http_name| - -| | 恩尼克斯|上游|请求|- -| `proxy_set_header`| | 上游|恩金斯|React|`$upstream_http_ `name| - -|
| 恩金斯|委托人|React|x1米20英寸1x| add_header|
NGINX使用不同的proxy_ directives从客户端请求复制到上游请求,从上游响应复制到客户端响应,为您提供了省略或显式包含两个方向的头的选项。因此,如果上游响应头只在$upstream_http_name变量中找到,则这些头不会被复制到客户端响应中。并且可用`$sent_http_ `name变量的集合将包括由NGINX设置的、在上游响应中不存在的任何 * 额外 * 报头。

llycmphe

llycmphe4#

使用$http_我的自定义标题
你可以这样写

set my_header $http_MY_CUSTOM_HEADER;
if($my_header != 'some-value') {
#do some thing;
}

相关问题