在 nginx 中,經(jīng)常需要因為各種原因,修改 header,所以今天整理下 nginx 中 header 的一些指令
header 是 http 中的消息頭,里面包含很多信息,通常又分為 request headers(請求頭)和 response headers(響應(yīng)頭)
客戶端向服務(wù)器發(fā)送的請求中包含請求頭,服務(wù)器向客戶端回復(fù)的響應(yīng)中包含響應(yīng)頭,消息頭通常是以冒號分隔的鍵值對
在 nginx 中有 headers 模塊,其中有三條指令,分別是:
-
add_header
-
add_trailer
-
expires
expires 就不用多說了,用來控制緩存時間的,證書就是緩存的時間,0 或負數(shù)就是緩存無效
add_trailer 和 add_header 一樣的效果,都是在 headers 中添加字段,不過 trailer 是添加到響應(yīng)頭的末尾
nginx 中通常就通過這三個控制 response 的 headers 信息
另外涉及到 headers 修改的指令,通常是在反向代理的時候,也就是 proxy_pass 的時候,有以下幾個指令可以操作 header
-
proxy_set_header
-
proxy_ignore_headers
-
proxy_pass_header
-
proxy_hide_header
-
proxy_pass_request_headers
proxy_set_header 通常用的最多,可以在提交給上游服務(wù)器的 header 中添加或重寫 header,比如通常用到的,反向代理的時候,添加客戶端 IP、XFF 等字段
proxy_ignore_headers 通常用來禁用上游服務(wù)器的某些響應(yīng)字段,如:
-
X-Accel-Expires
-
Expires
-
Cache-Control
-
Set-Cookie
-
Vary
-
X-Accel-Redirect
-
X-Accel-Limit-Rate
-
X-Accel-Buffering
-
X-Accel-Charset
不過根據(jù)測試發(fā)現(xiàn),根本不起任何作用,寫了個簡單的 php 腳本,用 proxy_pass 代理,在 php 中用 header 寫 Expires 字段
訪問查看 response headers
接著,用 proxy_ignore_headers 忽略掉 Expires 字段,再次請求看下效果
沒有任何效果,開始以為是在 php 中寫不行,寫到上游 nginx 配置中嘗試
訪問測試,仍然沒有忽略掉
生效的,仍然是后端的 expires,從官方以及網(wǎng)上看到的文章,我理解,都是忽略上游設(shè)置的 Expires
不過 proxy_hide_header 可以將上游響應(yīng)中的 header 中的字段忽略掉
請求如下:
proxy_pass_header 正好和 proxy_hide_header 相反,有些 header 字段 nginx 默認不會響應(yīng)到代理,nginx 官方文檔中舉例說 Date、Server、X-Pad、X-Accel 等字段,測試,同樣在 php 中設(shè)置 Server
在 nginx 中設(shè)置 proxy_pass_header Server
proxy_pass_request_headers 則是控制客戶端 request 的 header,是否傳遞到上游服務(wù)器,默認是開啟的,也就是客戶端請求攜帶的 header,都會被轉(zhuǎn)發(fā)到上游服務(wù)器,還是拿 php 腳本來獲取 request_header 信息
查看訪問結(jié)果:
在 nginx 中關(guān)閉 proxy_pass_request_headers
再次獲取訪問結(jié)果
以上就是 nginx 自帶的調(diào)整,設(shè)置 header 的一些指令,通常調(diào)整 header 最常見的幾個場景:
-
通過 add_header 添加允許跨域
-
通過 header 頭,設(shè)置緩存生效時間
-
通過添加自定義 header,做灰度
-
反向代理,將自定義字段傳遞到后端,特別 xff 獲取真實客戶端 IP
除了自帶的 headers 模塊,也可以安裝第三方的 headers-more 模塊,對應(yīng) headers 的控制更全面,更方便,headers-more 是 openresty 的一個模塊,openresty 就自帶了,nginx 的話,需要編譯添加動態(tài)模塊
headers-more 模塊下載地址:GitHub - openresty/headers-more-nginx-module: Set, add, and clear arbitrary output headers in NGINX http servers
下載好之后編輯添加
通過 make modules,編譯動態(tài)模塊文件,生成在 objs 目錄下,將.so 文件復(fù)制到 modules 目錄下,在 nginx 配置文件中通過 load_modules 加載
這樣 headers-more 模塊就添加好了
該模塊主要有 4 個指令:
-
more_set_headers 用于添加、修改、清除響應(yīng)頭
-
more_clear_headers 用于清除響應(yīng)頭
-
more_set_input_headers 用于添加、修改、清除請求頭
-
more_clear_input_headers 用于清除請求頭文章來源:http://www.zghlxwxcb.cn/news/detail-451736.html
headers-more 相比 nginx 自帶的 headers,處理 headers 更方便,更靈活,所以,如果有 nginx 自帶 headers 模塊滿足不了的需求,可以添加 headers-more 模塊文章來源地址http://www.zghlxwxcb.cn/news/detail-451736.html
到了這里,關(guān)于Nginx 中常見 header 配置及修改的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!