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

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

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

一、add_header指令不會去重

nginx做反向代理時(shí),如果后端返回的response中已經(jīng)有該header頭,則通過add_header后會返回給客戶端兩個(gè)同樣的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指令對重復(fù)指令的處理。

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)時(shí)會加上一個(gè)'Server: MytestB'的header。

  • 直接訪問B:

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

此時(shí)只有一個(gè)Server的 header,而且是A的openresty 版本標(biāo)識。

測試1結(jié)果:

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

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

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

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

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

語法: proxy_hide_header field;

默認(rèn)值: —

上下文: http, server, location

nginx默認(rèn)不會將“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如下:

此時(shí)和測試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默認(rèn)會隱藏上游返回的Server 的header頭,但是可以通過pass_header_header Server;來取消該限制,此時(shí)用戶會收到B返回的兩個(gè)header頭。

2、對于其他的非默認(rèn)屏蔽的header頭,則NginxA會原樣透傳給用戶。如果想屏蔽某個(gè)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的為準(zhǔn),在server里配置的Test1并不生效。同理在http段配置的更加不會生效。 優(yōu)先級location > server > http。

三、擴(kuò)展

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中加上配置項(xiàng): 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頭,如果想獲取到默認(rèn)被屏蔽掉的那些header,需要用proxy_pass_header來添加。

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

2、 Server-tag會覆蓋Server header頭

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

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    Nginx通過header中的標(biāo)識進(jìn)行分發(fā)

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

    使用nginx模擬進(jìn)行藍(lán)綠部署的方式

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

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

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

    nacos集群搭建Nginx負(fù)載均衡的操作詳解

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

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

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

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

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

最新評論

南木林县| 衢州市| 灵丘县| 黔南| 文水县| 林周县| 桐乡市| 汶上县| 江川县| 北京市| 繁昌县| 鸡东县| 齐齐哈尔市| 东乡县| 彝良县| 连州市| 三亚市| 鄢陵县| 曲阜市| 濉溪县| 多伦县| 长阳| 尉犁县| 遵义县| 凤凰县| 南陵县| 清苑县| 龙陵县| 新密市| 涞源县| 象州县| 永吉县| 环江| 山阳县| 赤壁市| 无为县| 屯留县| 鹤山市| 阳原县| 衡阳市| 汾阳市|