如何在proxy_pass

时间:2016-02-18 22:07:37

标签: nginx

从根本上讲,在将proxy_pass存储在变量中之后,我找到了一种方法来找到在nginx中删除响应头的方法。 proxy_hide_header不允许我存储值。

换句话说:

我正在尝试访问自定义响应标头,将其保存到变量中,并将其删除,以便它不会传播到客户端。然后在访问日志中使用该变量。 不幸的是,以下似乎不起作用:

http {

log_format main '$remote_addr $http_host $destination_addr [$time_local]   
"$request" $status';
access_log /opt/logs/access.log main;

server { 
 listen 142.133.151.129:8090 default; 

 ##This is my internal variable for the response header field 
 set $destination_addr "-"; 

 location / { 
   proxy_pass http://my_upstream_server; 

   #store the response header field
   set $destination_addr $sent_http_x_destination; 

   #now get rid of this response header field
   set $sent_http_x_destination ""; 
  }   
 }
}

我为$ sent_http_x_destination获取空值。

以下是卷曲请求和响应:

# curl -Ov http://142.133.151.129:8090/ao3/vod/soccer/worldcup2014/final1

< HTTP/1.1 206 Partial Content
< Server: openresty/1.9.3.1
< Date: Tue, 16 Feb 2016 22:25:32 GMT
< Content-Type: application/octet-stream
< Content-Length: 99990100
< Connection: keep-alive
< X-Destination: 142.133.151.94 

有人知道如何在存储并用于访问日志后删除“X-Destination”吗?我得到“$ destination_addr”,空值。

由于

3 个答案:

答案 0 :(得分:2)

一个人可以使用output$dtOutput <- DT::renderDataTable({ dtToShow <- as.data.table(lList) colnames(dtToShow) <- c("List") data.table( data = dtToShow), rownames = F,extensions = "RowReorder", server = F, escape = F, options = list(rowReorder = T, searching = F, ordering = F, paging = F) }) 从代理中删除返回给NGINX的标头,请参见ngx_http_proxy_module docs
DECLARE @string VARCHAR(500) = '{"ABC":1,"ABC_DT":-1,"ABC_DBQty":0,"ABC_DSQty":0,"ABC_LMT":1,"ABC_DT":-1,"CTSD":"TEST","TE":23}' SET @string = REVERSE(@string) SELECT REVERSE( SUBSTRING(@string,2,CHARINDEX(':',@string)-1-1) ) --return: 23 可用于记录日志,请参见ngx_http_upstream_module docs

重写配置如下:

proxy_hide_header

答案 1 :(得分:1)

我对此并不完全确定,但我认为只要您依赖该日志标题,就需要将其设置为标题...否则,日志将无法使用它

话虽如此,您可以尝试proxy_hide_header并查看它是否有效。

答案 2 :(得分:1)

我能看到的唯一方法是创建一个lua脚本,它将使用http-resty重新实现代理传递,将头保存在nginx变量中并在返回之前将其删除。然后,保存的nginx变量将用于访问日志。 这是我的答案。 我希望nginx提供一种更简单的方法。

请告诉我您对此答案的评论。 感谢您对此主题的所有意见!