header_logo

Nginx 安全標頭的 3 個坑:你以為有設,其實沒生效

JordanTTC

2026.10.14

0/6

替網站加上 HSTS、CSP 這些安全標頭時,這些是我自己遇過,第一次遇到時想說是怎樣為啥掛掉了,但是又沒報錯的坑:

  1. 想替整站加標頭,又多寫了一個 location /,nginx -t 直接失敗
    報錯是 duplicate location "/",因為設定裡本來就已經有一個 location / 了。要套用到整站的標頭,直接寫在 server {} 層級就好,不用再另外開一個 location。
  2. 在任何一個 location 裡寫了 add_header,server 層級設定的安全標頭在這個 location 就全部失效。首頁檢查正常,/assets/、/api/ 卻都沒有
    這是 nginx 的繼承規則:只要這個 location 自己有寫任何一個 add_header,外層的 add_header 就一個都不會繼承進來,不是只有同名的被蓋掉。所以只檢查首頁很容易誤以為沒問題,每個有設定 add_header 的路徑都要用 curl -I 各檢查一次。解法是把安全標頭抽成一個 snippet,每個有自己 add_header 的 location 都 include 進來(圖 4)。
  3. 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 的做法比較保險。

延伸閱讀
回到列表

隨時掌握設計趨勢

訂閱即表示您同意我們的隱私政策,並同意接收我們公司的更新。

Copyright © WebCRACK. All rights reserved.

版塊創意有限公司

| hello@webcrack.tw

| 統編:83197129