ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用 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
    // ...
}

这可能吗?提前致谢。


M
Martijn Pieters

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

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

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


事实证明,这也不正确。 OP 要求读取响应标头的值。您应该使用 $sent_http_my_custom_headernginx.org/en/docs/http/ngx_http_core_module.html#var_sent_http_
如果您需要上游响应标头,请检查下面的@dev-gosain 答案
答案是错误的。询问的人正在尝试从 upstream 服务器访问标头。正确答案是stackoverflow.com/a/30879181/111995
2015 年的一次修改使这个答案更多错误,其中 $sent_http_$http_ 取代。我现在已经恢复了那个编辑。答案仍然不正确。 $sent_http_name 是一个 client 响应标头,从 NGINX 发送到客户端。 OP 要求 upstream 响应标头,即从上游服务器返回 NGINX 的响应中的条目。两者之间的区别在于某些标头没有从上游转发到客户端。此外,您不能在 if 条件中使用响应标头变量
t
tbraun89

我面临着同样的问题。我尝试了 $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
M
Martijn Pieters

使用 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。


V
Vladimir

使用 $http_MY_CUSTOM_HEADER

你可以写一些像

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

man 说 - 变量名称的最后一部分是转换为小写的字段名称,其中破折号替换为下划线。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅