nginx關於add header的坑

2021-09-12 06:33:09 字數 3461 閱讀 6098

nginx做反向**時,如果後端返回的response中已經有該header頭,則通過add_header後會返回給客戶端兩個同樣的header頭。

場景1:

nginxa作為反向**,nginxb作為web服務。我是拿的openresty 1.13.6.2測試的,本質上是一樣,其中a是openresty 1.15.8.1嗎,b是openresty 1.13.6.2。

測試1:   add_header指令對重複指令的處理。

a的location配置如下:

server 

}

nginxb的配置如下:

server       

}

這種配置下,b返回給a響應時會加上乙個'server: mytestb'的header。

此時只有乙個server的 header,而且是a的openresty 版本標識。

測試1結果:

1 : nginx返回響應時,會自動在http報文裡加上了當前自己的server標識。

2:  單純的配置add_header指令時,如果response中已經有該header了,則會重複新增。

3:  通過反向**nginxa之後,a會隱藏掉b返回給自己的server header頭,並將自己的server標識返回給客戶端。

測試2: proxy_hide_headerproxy_pass_header指令對add_header有影響嗎?

說明:proxy_hide_header : nginx在做反向**時,為了隱藏上游伺服器的資訊,不會將上游的server返回給客戶端。

語法: proxy_hide_header field;

預設值: —

上下文: http, server, location

nginx預設不會將「date」、「server」、「x-pad」,和「x-accel-...」響應頭髮送給客戶端。proxy_hide_header指令則可以設定額外的響應頭,這些響應頭也不會傳送給客戶端。

proxy_pass_header:和proxy_hide_header相反,如果希望允許傳遞某些響應頭給客戶端,可以使用proxy_pass_header指令。例如: proxy_pass_header server; 則告訴nginx服務傳遞上游的server頭,而不是將它自己放在響應中。

server 

}

通過a訪問b如下:

此時和測試1中的直接訪問b結果一樣。

測試2結果:1、 nginx缺省會隱藏上游返回的server 的header頭,但是可以通過pass_header_header server;來取消該限制,此時使用者會收到b返回的兩個header頭。

2、對於其他的非預設遮蔽的header頭,則nginxa會原樣透傳給使用者。如果想遮蔽某個header頭,可以通過proxy_hide_header指令。

如果在http、server、location都配置了add_header指令之後,返回給使用者的是什麼呢?

例如如下配置:

server 

}

這樣的配置下,會返回給使用者什麼header呢?

答案是只會以location的為準,在server裡配置的test1並不生效。同理在http段配置的更加不會生效。 優先順序location > server > http。

1、 ngx.resp.get_headers()

對nginx a測試 ngx.resp.get_headers

-- header.lua

local json = require('cjson')

local h, err = ngx.resp.get_headers()

ngx.log(ngx.err, '-------resp header:-------', json.encode(h))

結果如下:

接著在a中加上配置項: proxy_pass_header server;

再次測試結果:

結論:

1、ngx.resp.get_headers() 只能獲取到proxy_hide_header外的header頭,如果想獲取到預設被遮蔽掉的那些header,需要用proxy_pass_header來新增。

2、 預設情況下,此api獲取到的header是乙個key-value形式,但是如果upstream返回了兩個同樣的header,lua會用陣列的形式儲存。

2、 server-tag會覆蓋server header頭

後端b換成tenginx,並且在nginx.conf中加上server-tag: mytestb

則 b返回給a的響應頭中,那個預設的server頭已經由openresty/1.13.6.1換成了 mytestb,則a再記錄日誌,返回給使用者都是zzt-server

3、  **自定義server的header頭會覆蓋nginx自帶的

後端b是golang服務,golang**裡加上server頭,則同樣可以滿足2中的效果。

關於nginx配置

通常,配置檔案可以包括伺服器監聽的埠和伺服器名稱區分的幾個server塊。當nginx決定哪個伺服器處理請求後,它會根據伺服器塊內部定義的location指令的引數測試請求頭中指定的uri。將以下location塊新增到伺服器 server 塊 該location塊指定與請求中的uri相比較的 字首...

關於Nginx理解

基礎知識 nginx由於使用了 epoll模型,要求linux的核心必須在2.6以上。要了解epoll模型,可以看看知乎上的這篇文章 io多路復用與 select,poll與epoll的關係 使用 uname a 檢視linux 核心版本,如下是centos 6.5的顯示 編譯與安裝 nginx依賴...

Nginx 關於日誌切割

nginx關於日誌切割,由於原nginx本身日誌已經上g了,對運維造成了巨大的負擔,查了網上一般都是寫指令碼,進行日誌切割,但是,原nginx中已經有可以切割日誌的配置了 一 修改nginx中的配置檔案,nginx.conf,首先對原日誌檔案中注釋掉的檔案進行釋放 然後在server中新增此段檔案,...