我正在使用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
// ...
}
这可能吗?
4条答案
按热度按时间6za6bjd01#
这不仅是可能的,而且很容易:
在nginx中,响应头的值是通过一个变量(每个头一个)获得的。2http://wiki.nginx.org/HttpCoreModule#.24sent_http_HEADER关于这些变量的详细信息,请参见www.example.com。
在您的示例中,变量将是$sent_http_My_custom_header。
enyaitl32#
我也遇到了同样的问题,我试过
$http_my_custom_header
和$sent_http_my_custom_header
,但对我不起作用。虽然使用
$upstream_http_my_custom_header
解决了这个问题。imzjd6km3#
当使用NGINX作为代理时,有四组报头:
client -> nginx
:客户端 * 请求 * 标头nginx -> upstream
:上游 * 请求 * 报头upstream -> nginx
:上游 * 响应 * 报头nginx -> client
:客户端 * 响应 * 报头您似乎在询问上游响应头,它们可以在
$upstream_http_
name``变量中找到。if
指令都在发送上游请求 * 之前 * 运行,并且将无法访问任何响应标头!换句话说,if
指令在收到客户端请求之后、发出上游请求之前运行。如果需要更改响应的处理方式,可以使用
map
directive但是根据响应头设置变量,然后在add_header
中使用这些变量(设置客户端响应报头),log_format
或任何其他在响应阶段处于活动状态的指令(内部命名为NGX_HTTP_CONTENT_PHASE
和NGX_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设置的、在上游响应中不存在的任何 * 额外 * 报头。llycmphe4#
使用$http_我的自定义标题
你可以这样写