為何要小心Nginx的add_header指令詳解
前言
大家都知道,nginx配置文件通過使用add_header指令來設(shè)置response header。
昨天無聊用curl查看一個(gè)站點(diǎn)的信息,發(fā)現(xiàn)返回的頭部與想象中的不一樣:
HTTP/2 200 date: Thu, 07 Feb 2019 04:26:38 GMT content-type: text/html; charset=UTF-8 vary: Accept-Encoding, Cookie cache-control: max-age=3, must-revalidate last-modified: Thu, 07 Feb 2019 03:54:54 GMT X-Cache: Miss server: cloudflare ...
主站點(diǎn)在nginx.conf中配置了HSTS等header:
add_header Strict-Transport-Security "max-age=63072000; preload"; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block";
但響應(yīng)頭部沒有這些header。除了常規(guī)的header,僅出現(xiàn)了一個(gè)配置配置在location中的header X-Cache。
第一印象是CDN過濾了這些header?于是找Cloudflare的文檔,沒發(fā)現(xiàn)會(huì)對(duì)這些進(jìn)行處理。轉(zhuǎn)念一想,CDN過濾這些干啥啊?吃飽了撐的???他們又不搞zheng審那一套!
問題轉(zhuǎn)移到Nginx的配置上。打開Google搜索”nginx location add_header”,果然發(fā)現(xiàn)不少槽點(diǎn)。點(diǎn)開官網(wǎng)add_header的文檔,有這樣的描述(其他信息已省略):
There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.
注意重點(diǎn)在“These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level. ”。即:僅當(dāng)當(dāng)前層級(jí)中沒有add_header指令才會(huì)繼承父級(jí)設(shè)置。所以我的疑問就清晰了:location中有add_header,nginx.conf中的配置被丟棄了。
這是Nginx的故意行為,說不上是bug或坑。但深入體會(huì)這句話,會(huì)發(fā)現(xiàn)更有意思的現(xiàn)象:僅最近一處的add_header起作用。http、server和location三處均可配置add_header,但起作用的是最接近的配置,往上的配置都會(huì)失效。
但問題還不僅于此。如果location中rewrite到另一個(gè)location,最后結(jié)果僅出現(xiàn)第二個(gè)的header。例如:
location /foo1 {
add_header foo1 1;
rewrite / /foo2;
}
location /foo2 {
add_header foo2 1;
return 200 "OK";
}
不管請(qǐng)求/foo1還是/foo2,最終header只有foo2:

盡管說得通這是正常行為,但總讓人感覺有點(diǎn)勉強(qiáng)和不舒坦:server丟掉http配置,location丟掉server配置也就算了,但兩個(gè)location在同一層級(jí)??!
不能繼承父級(jí)配置,又不想在當(dāng)前塊重復(fù)指令,解決辦法可以用include指令。
參考
- Nginx Module ngx_http_headers_module
- Nginx add_header configuration pitfall
- Be very careful with your add_header in Nginx! You might make your site insecure
- add_header directives in location overwriting add_header directives in server
- nginx 配置之 add_header 的坑
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Nginx中的用戶認(rèn)證配置及阻止用戶使用代理訪問的方法
這篇文章主要介紹了Nginx中的用戶認(rèn)證配置及阻止用戶使用代理訪問的方法,用戶認(rèn)證部分用到了自帶的ngx_http_auth_basic_module模塊,需要的朋友可以參考下2016-01-01
Nginx服務(wù)器下使用rewrite重寫url以實(shí)現(xiàn)偽靜態(tài)的示例
這篇文章主要介紹了Nginx服務(wù)器下使用rewrite重寫url以實(shí)現(xiàn)偽靜態(tài)的示例,這里舉了Discuz!和WordPress這兩個(gè)常用的PHP程序,需要的朋友可以參考下2015-12-12
Nginx利用Logrotate實(shí)現(xiàn)日志分割的詳細(xì)過程
nginx日志分割是很常見的運(yùn)維工作,下面這篇文章主要給大家介紹了關(guān)于Nginx利用Logrotate日志分割的詳細(xì)過程,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
寶塔里nginx自動(dòng)停止的解決方法(檢測(cè)腳本實(shí)現(xiàn)每分鐘檢測(cè)并自動(dòng)啟用)
nginx突然停止的原因有多種,這里不列舉,可以排查具體原因,這里主要為大家分享nginx服務(wù)的檢測(cè)腳本,達(dá)到自動(dòng)啟用的實(shí)現(xiàn)2025-02-02
FastDFS+Nginx如何搭建本地服務(wù)器并實(shí)現(xiàn)遠(yuǎn)程訪問
FastDFS是一個(gè)開源的輕量級(jí)分布式文件系統(tǒng),它對(duì)文件進(jìn)行管理,功能包括:文件存儲(chǔ)、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲(chǔ)和負(fù)載均衡的問題,這篇文章主要介紹了FastDFS+Nginx搭建本地服務(wù)器并實(shí)現(xiàn)遠(yuǎn)程訪問,需要的朋友可以參考下2023-11-11
樹莓派安裝與配置 Nginx Web 服務(wù)器的詳細(xì)教程
本文詳細(xì)介紹了在樹莓派上安裝和配置Nginx作為Web服務(wù)器的全過程,包括系統(tǒng)更新、Nginx安裝、服務(wù)啟動(dòng)、配置文件修改、虛擬主機(jī)設(shè)置、防火墻配置、自動(dòng)啟動(dòng)設(shè)置、HTTPS配置以及定期日志檢查等步驟,通過這些步驟,可以成功將樹莓派設(shè)置為運(yùn)行Web服務(wù)的服務(wù)器2024-11-11
nginx前端部署后,訪問不到同一臺(tái)機(jī)器的后端問題
這篇文章主要介紹了nginx前端部署后,訪問不到同一臺(tái)機(jī)器的后端問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

