nginx配置add_header的坑怎么解決

前言

add_header 是 headers 模塊中定義的一個指令,顧名思義就是用來添加 http 響應(yīng)頭的。但請注意他只是「添加」而已,并不是重寫。所以如果已經(jīng)存在某個頭,再使用 add_header 就會出問題。而且在低版本的 nginx 中 add_header 還不支持在錯誤頁面中使用。

這是一個坑比較多的指令。它的處理階段比 location 處理晚,雖然可以寫在 location 中,但如果 rewrite 別的 location,那么上一個 location 中尚未處理的 add_header 就會丟失。比如:

location?=?/a?{ ?add_header?a?1; ?rewrite?/?/b; } location?=?/b?{ ?add_header?b?2; ?return?204; }

nginx配置add_header的坑怎么解決

并沒有 a 1 這個頭吧?這就是一個坑!

另一個坑就是一開始說的重復(fù)的問題,比如我希望給一個內(nèi)容設(shè)置 content-type,但是由于全局有設(shè)置一個 default_type,所以就重復(fù)了。

default_type?'text/plain';  location?=?/a?{ ?add_header?content-type?application/json; ?return?200?'"ok"'; }

nginx配置add_header的坑怎么解決

解決的辦法當(dāng)然有很多比如對這個 location 將 default_type 置空,或者干脆不用 add_header,直接針對這個 location 修改 default_type。

最后一個大坑就是對錯誤頁面無法生效,這也是在中有明確定義的。比如下面這個例子:

location?=?/a?{ ?add_header?content-type?application/json; ?return?404?'"not?found"'; }

我希望響應(yīng)一個 json,然而由于狀態(tài)碼是 404,所以這里的 add_header 并不會生效。

nginx配置add_header的坑怎么解決

雖然這個例子可以用 default_type 來解決問題,但如果是其它頭呢?比如 access-control-allow-origin 要怎么辦?那么除了使用 lua 或其它第三方模塊來解決之外就無解了。nginx 當(dāng)然也意識到了這個問題,所以文檔中也說了在 1.7.5 版本之后支持一個叫 always 的參數(shù)。雖然 nginx 自己解決了這個問題,但基于 1.6.2 的 tengine 就要呵呵了。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊15 分享