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

lui*_*uis 65 reverse-proxy 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
Run Code Online (Sandbox Code Playgroud)

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

location / {
    // ...
    // get My-custom-header value here
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?提前致谢.

Mar*_*ers 74

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

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

您似乎在询问上游响应标头。这些可以在变量中找到。$upstream_http_name

\n

但是,请考虑到只有在收到来自上游服务器响应的标头才会设置任何响应标头。任何指令都在发送上游请求之前运行,并且无法访问任何响应标头!换句话说,ifif指令在收到客户端请求之后、发出上游请求之前运行。

\n

如果您需要更改响应的处理方式,则可以使用指令map根据响应标头设置变量,然后在add_header(设置客户端响应标头)中使用这些变量,log_format或在响应阶段(内部)处于活动状态的任何其他指令命名为NGX_HTTP_CONTENT_PHASENGX_HTTP_LOG_PHASE阶段)。对于更复杂的控制,您必须使用脚本附加组件,例如Lua 模块(例如使用header_filter_by_lua_block指令)。

\n

要读取或设置单独的标头,请使用:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
类型读取(变量)写(指令)
客户nginx要求$http_name\xe2\x80\x93
恩尼克斯上游要求\xe2\x80\x93proxy_set_header
上游nginx回复$upstream_http_name\xe2\x80\x93
nginx客户回复$sent_http_nameadd_header
\n
\n

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

\n


cob*_*aco 73

$ http _ name_of_the_header_key

即如果你有origin = domain.com标题,你可以$http_origin用来获取" domain.com "

在nginx中确实支持任意请求头字段.在上面的示例中,变量名称的最后一部分是字段名称转换为小写,其中破折号由下划线替换

参考文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#var_http_

对于你的例子,变量将是$http_my_custom_header.

  • 事实证明,这也不正确.OP要求读取响应头的值.你应该使用`$ sent_http_my_custom_header`.http://nginx.org/en/docs/http/ngx_http_core_module.html#var_sent_http_ (10认同)
  • 答案是错的.询问的人试图从**上游**服务器访问标头.正确答案是http://stackoverflow.com/a/30879181/111995 (9认同)
  • 实际上,这是错误的,不应该标记答案.对于将来遇到这种情况的人来说,正确的变量是`$ http_`.以OP为例,`$ http_my_custom_header`(区分大小写!) (3认同)

Dev*_*ain 42

我面临同样的问题.我试过了两次$http_my_custom_header,$sent_http_my_custom_header但它对我不起作用.

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


Vla*_*mir 7

使用$ http_MY_CUSTOM_HEADER

你可以写一些像

set my_header $http_MY_CUSTOM_HEADER;
if($my_header != 'some-value') {
#do some thing;
}
Run Code Online (Sandbox Code Playgroud)

  • 男人说-变量名称的最后一部分是字段名称,该字段名称转换为__小写__,并用短划线代替了下划线。 (4认同)