最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nginx關(guān)于add_header的坑及解決

 更新時間:2023年12月22日 09:49:37   作者:Mr.zhang0325  
這篇文章主要介紹了nginx關(guān)于add_header的坑及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、add_header指令不會去重

nginx做反向代理時,如果后端返回的response中已經(jīng)有該header頭,則通過add_header后會返回給客戶端兩個同樣的header頭。

場景1:

nginxA作為反向代理,nginxB作為web服務(wù)。我是拿的openresty 1.13.6.2測試的,本質(zhì)上是一樣,其中A是openresty 1.15.8.1嗎,B是openresty 1.13.6.2。

其中 nginxA 的日志格式里配置了打印上游返回的Server頭: xes-app : $http_upstream_server

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

A的location配置如下:

server {
      listen 80;
      server_name test.header.com;
      access_log /home/nginx/logs/test.header.com_access.log main;
      error_log  /home/nginx/logs/error.log  debug;
 
      location / {
          set $upstream 'test.header.com';
          proxy_pass http://$upstream;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          
      }
}

nginxB的配置如下:

server{
      listen 80;
      server_name test.header.com;
      access_log  /home/nginx/logs/test.header.com.log main;
      index  index.php index.html index.htm;
      location / {
            add_header Server 'MytestB'; 
            return 200 "this is test header from zlear"; 
      }       
}

這種配置下,B返回給A響應(yīng)時會加上一個'Server: MytestB'的header。

  • 直接訪問B:

  • 訪問A,A反向代理到B:

此時只有一個Server的 header,而且是A的openresty 版本標識。

測試1結(jié)果:

1 : nginx返回響應(yīng)時,會自動在http報文里加上了當前自己的Server標識。

2:  單純的配置add_header指令時,如果response中已經(jīng)有該header了,則會重復添加。

3:  通過反向代理NginxA之后,A會隱藏掉B返回給自己的Server Header頭,并將自己的Server標識返回給客戶端。

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

說明:proxy_hide_header : nginx在做反向代理時,為了隱藏上游服務(wù)器的信息,不會將上游的Server返回給客戶端。

語法: proxy_hide_header field;

默認值: —

上下文: http, server, location

nginx默認不會將“Date”、“Server”、“X-Pad”,和“X-Accel-...”響應(yīng)頭發(fā)送給客戶端。proxy_hide_header指令則可以設(shè)置額外的響應(yīng)頭,這些響應(yīng)頭也不會發(fā)送給客戶端。

proxy_pass_header:   和proxy_hide_header相反,如果希望允許傳遞某些響應(yīng)頭給客戶端,可以使用proxy_pass_header指令。

例如: proxy_pass_header Server; 則告訴nginx服務(wù)傳遞上游的Server頭,而不是將它自己放在響應(yīng)中。

  • 在測試1的基礎(chǔ)上,在A上加上proxy_pass_header指令:
server {
      listen 80;
      server_name test.header.com;
      access_log /home/nginx/logs/test.header.com_access.log main;
      error_log  /home/nginx/logs/error.log  debug;
 
      location / {
          set $upstream 'test.header.com';
          proxy_pass http://$upstream;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_pass_header Server;
          
      }
}

通過A訪問B如下:

此時和測試1中的直接訪問B結(jié)果一樣。

  • 在測試1的基礎(chǔ)上,在NginxB上添加指令add_header MytestB MytestB;
server{
      listen 80;
      server_name test.header.com;
      access_log  /home/nginx/logs/test.header.com.log main;
      index  index.php index.html index.htm;
      location / {
            add_header Server  'MytestB'; 
            add_header MytestB 'MytestB'; 
            return 200 "this is test header from zlear"; 
      }       
}

測試2結(jié)果:

1、 nginx默認會隱藏上游返回的Server 的header頭,但是可以通過pass_header_header Server;來取消該限制,此時用戶會收到B返回的兩個header頭。

2、對于其他的非默認屏蔽的header頭,則NginxA會原樣透傳給用戶。如果想屏蔽某個header頭,可以通過proxy_hide_header指令。

二、add_header指令會覆蓋

如果在http、server、location都配置了add_header指令之后,返回給用戶的是什么呢?

例如如下配置:

server {
      listen 80;
      server_name test.header.com;
      access_log /home/nginx/logs/test.header.com_access.log main;
      error_log  /home/nginx/logs/error.log  debug;
      add_header Test1 AAA;
 
      location / {
          set $upstream 'test.header.com';
          proxy_pass http://$upstream;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          add_header Test2 BBB;
          
      }
}

這樣的配置下,會返回給用戶什么header呢?

答案是只會以location的為準,在server里配置的Test1并不生效。同理在http段配置的更加不會生效。 優(yōu)先級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))

結(jié)果如下:

2020/08/06 10:07:02 [error] 5616#0: *15175 [lua] header.lua:9: -------resp header:-------{"connection":"keep-alive","content-type":"application\/octet-stream","mytestb":"MytestB","content-length":"34"} while reading response header from upstream, client: 127.0.0.1, server: test.header.com, request: "GET http://test.header.com/aaa HTTP/1.1", upstream: "http://xxxx:80/aaa", host: "test.header.com"

接著在A中加上配置項: proxy_pass_header Server;

再次測試結(jié)果:

2020/08/06 10:04:58 [error] 5564#0: *14655 [lua] header.lua:9: -------resp header:-------{"content-type":"application\/octet-stream","server":["openresty\/1.13.6.2","MytestB"],"connection":"keep-alive","mytestb":"MytestB","content-length":"34"} while reading response header from upstream, client: 127.0.0.1, server: test.header.com, request: "GET http://test.header.com/aaa HTTP/1.1", upstream: "http://xxx:80/aaa", host: "test.header.com"

結(jié)論

1、ngx.resp.get_headers() 只能獲取到proxy_hide_header外的header頭,如果想獲取到默認被屏蔽掉的那些header,需要用proxy_pass_header來添加。

2、 默認情況下,此api獲取到的header是一個key-value形式,但是如果upstream返回了兩個同樣的header,lua會用數(shù)組的形式存儲。

2、 Server-tag會覆蓋Server header頭

后端B換成Tenginx,并且在nginx.conf中加上Server-tag: MytestB

則 B返回給A的響應(yīng)頭中,那個默認的Server頭已經(jīng)由openresty/1.13.6.1換成了 MytestB,則A再記錄日志,返回給用戶都是zzt-Server

3、  代碼自定義Server的header頭會覆蓋nginx自帶的

后端B是golang服務(wù),golang代碼里加上Server頭,則同樣可以滿足2中的效果。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Nginx安裝后常用功能配置基礎(chǔ)篇

    Nginx安裝后常用功能配置基礎(chǔ)篇

    這篇文章主要介紹了Nginx安裝后常用的功能配置,為了在使用中更高效簡潔,Nginx安裝后通常會進行一些常用的配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • nginx 版本升級的實現(xiàn)方法

    nginx 版本升級的實現(xiàn)方法

    文介紹了如何在CentOS7服務(wù)器上無中斷地將Nginx從1.18.0版本升級到1.19.7版本,提供了兩種升級方法,具有一定的參考價值,感興趣的可以了解一下
    2024-09-09
  • 在Nginx服務(wù)器上安裝SSL證書完成HTTPS請求的步驟詳解(springboot項目)

    在Nginx服務(wù)器上安裝SSL證書完成HTTPS請求的步驟詳解(springboot項目)

    這篇文章主要介紹了在Nginx服務(wù)器上安裝SSL證書完成HTTPS請求(springboot項目),首先需要下載證書到本地接著在Nginx獨立服務(wù)器上安裝證書,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2022-04-04
  • Nginx跨域代理的完整排坑指南(從證書錯誤到CORS配置)

    Nginx跨域代理的完整排坑指南(從證書錯誤到CORS配置)

    本文詳細記錄了一個項目中使用Nginx作為反向代理解決跨域問題的過程,從為子域名申請獨立SSL證書、處理CORS預(yù)檢請求、避免add_header語法錯誤、正確設(shè)置代理Host頭、以及后端HTTPS證書問題等方面逐一排查并解決,最終得到正確的Nginx配置,需要的朋友可以參考下
    2026-04-04
  • Nginx通過header中的標識進行分發(fā)

    Nginx通過header中的標識進行分發(fā)

    本文主要介紹了Nginx通過header中的標識進行分發(fā),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • 使用nginx模擬進行藍綠部署的方式

    使用nginx模擬進行藍綠部署的方式

    今天小編就為大家分享一篇關(guān)于使用nginx模擬進行藍綠部署的方式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • LNMP編譯安裝之nginx安裝配置方法圖文教程

    LNMP編譯安裝之nginx安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了LNMP編譯安裝之nginx安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • nacos集群搭建Nginx負載均衡的操作詳解

    nacos集群搭建Nginx負載均衡的操作詳解

    這篇文章主要介紹了nacos集群搭建Nginx負載均衡的詳細操作,文中通過代碼示例和圖文介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • nginx版本熱更新實現(xiàn)過程

    nginx版本熱更新實現(xiàn)過程

    這篇文章主要介紹了nginx版本熱更新實現(xiàn)過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • Nginx FastCGI緩存的實現(xiàn)示例

    Nginx FastCGI緩存的實現(xiàn)示例

    Nginx的FastCGI緩存是一種性能優(yōu)化手段,通過緩存動態(tài)內(nèi)容減少對后端服務(wù)器的請求,提高系統(tǒng)響應(yīng)速度,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12

最新評論

会泽县| 通化县| 德令哈市| 舒兰市| 高雄县| 阿克苏市| 玉林市| 滁州市| 鹤山市| 凤山市| 定安县| 泗洪县| 屏南县| 专栏| 烟台市| 郴州市| 尖扎县| 辉县市| 东乡| 醴陵市| 高邮市| 江油市| 嘉义县| 多伦县| 乐亭县| 云林县| 滦南县| 色达县| 亳州市| 山西省| 西乌珠穆沁旗| 城口县| 丹巴县| 泸州市| 石柱| 乐至县| 铜陵市| 巨野县| 城固县| 兴山县| 娱乐|