0/6
替網站加上 HSTS、CSP 這些安全標頭時,這些是我自己遇過,第一次遇到時想說是怎樣為啥掛掉了,但是又沒報錯的坑:
- 想替整站加標頭,又多寫了一個
location /,nginx -t直接失敗
報錯是duplicate location "/",因為設定裡本來就已經有一個location /了。要套用到整站的標頭,直接寫在server {}層級就好,不用再另外開一個 location。 - 在任何一個 location 裡寫了
add_header,server 層級設定的安全標頭在這個 location 就全部失效。首頁檢查正常,/assets/、/api/卻都沒有
這是 nginx 的繼承規則:只要這個 location 自己有寫任何一個add_header,外層的add_header就一個都不會繼承進來,不是只有同名的被蓋掉。所以只檢查首頁很容易誤以為沒問題,每個有設定add_header的路徑都要用curl -I各檢查一次。解法是把安全標頭抽成一個 snippet,每個有自己add_header的 location 都 include 進來(圖 4)。 - CSP 裡的網址加了單引號,例如
'https://www.youtube.com',瀏覽器會把整個來源忽略,嵌入的影片、字型就被擋下來
單引號只用在'self'、'none'這類關鍵字,網址不能加。加了之後那個來源會被視為無效而丟掉,Console 會跳出 invalid source 的警告,但 nginx 完全不會報錯,沒打開 DevTools 的 Console 根本看不到。
解法和上線前的檢查清單都在圖裡。以上三個坑都在 nginx 1.24 和 Chromium 實際測過。
補充:nginx 1.29.3 起新增了 add_header_inherit merge;,可以讓外層的標頭自動合併進來。不過 Ubuntu 24.04 內建的是 1.24 版,目前還是用 include 的做法比較保險。