我正在使用 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
// ...
}
这可能吗?提前致谢。
这不仅可能,而且很容易:
在 nginx 中,响应标头值可通过变量(每个标头一个)获得。有关这些变量的详细信息,请参见 http://wiki.nginx.org/HttpCoreModule#.24sent_http_HEADER。
在您的示例中,变量将是 $sent_http_My_custom_header。
我面临着同样的问题。我尝试了 $http_my_custom_header
和 $sent_http_my_custom_header
,但它对我不起作用。
虽然通过使用 $upstream_http_my_custom_header
解决了这个问题。
$upstream_http_name
模式:nginx.org/en/docs/http/ngx_http_upstream_module.html#variables
使用 NGINX 作为代理时,有四组标头:
client -> nginx:客户端请求头
nginx -> upstream:上游请求标头
上游 -> nginx:上游响应标头
nginx -> 客户端:客户端响应标头
您似乎在询问上游响应标头。这些在 $upstream_http_name
variables 中找到。
然而,请注意,任何响应 标头仅在收到上游服务器响应的标头之后设置。任何 if
directives 在发送上游请求之前运行,并且无法访问任何响应标头!换句话说,if
指令在收到客户端请求之后运行,然后再发出上游请求。
如果您需要更改响应的处理方式,您可以使用 map
directive 但是根据响应标头设置变量,然后在 add_header
(设置客户端响应标头)、log_format
或任何其他指令中使用这些变量在响应阶段处于活动状态(内部命名为 NGX_HTTP_CONTENT_PHASE
and NGX_HTTP_LOG_PHASE
phases)。对于更复杂的控制,您必须使用脚本插件,例如 Lua module(例如使用 header_filter_by_lua_block
directive)。
要读取或设置单个标题,请使用:
从到类型读取(变量)写入(指令)客户端 nginx 请求 $http_name – ngnix 上游请求 – proxy_set_header 上游 nginx 响应 $upstream_http_name – nginx 客户端响应 $sent_http_name add_header
NGINX 使用各种 proxy_
directives 将某些标头从客户端请求复制到上游请求,并从上游响应复制到客户端响应,从而为您提供省略或显式包含任一方向的标头的选项。因此,如果仅在 $upstream_http_name
变量中找到上游响应标头,则这些标头不会专门复制到客户端响应,并且可用的 $sent_http_name
变量集将包括由设置的任何 extra 标头上游响应中不存在的 NGINX。
使用 $http_MY_CUSTOM_HEADER
你可以写一些像
set my_header $http_MY_CUSTOM_HEADER;
if($my_header != 'some-value') {
#do some thing;
}
$sent_http_my_custom_header
。 nginx.org/en/docs/http/ngx_http_core_module.html#var_sent_http_$sent_http_
被$http_
取代。我现在已经恢复了那个编辑。答案仍然不正确。$sent_http_name
是一个 client 响应标头,从 NGINX 发送到客户端。 OP 要求 upstream 响应标头,即从上游服务器返回 NGINX 的响应中的条目。两者之间的区别在于某些标头没有从上游转发到客户端。此外,您不能在if
条件中使用响应标头变量。