【坑】Nginx add_header 由於繼承特性不生效

前言

今天發生了一件很玄學的事情。html

今天業務在羣裏面發消息說:"客服今天收到客戶反饋一個網站:https://www.***./,點進去以後,發現進入的是咱們商城的前臺,如出一轍,也能夠進入chat聊天。咱們在這個網站測試下了個訂單,發現提交後,咱們後臺也是能夠搜到這個訂單的: 這個網站是咱們的嗎?只是域名不一樣嗎?nginx

咱們全體開發仔細盯了盯而後思考了一下,這個網站不是咱們的啊。而後開始研究了這個網站,發現這個網站就是用 iframe 嵌入了咱們的網站。"shell

WTFbash

就是下面這種代碼app

<iframe title="****" src="https://www.****.com/****.html" height="100%" width="100%" frameborder="0"></iframe>
複製代碼

這是個大問題啊,萬一誤導客戶之後這相似的網站作一些釣魚的連接把咱們的名聲搞壞就不得了了。要想辦法杜絕這種相似的問題。測試

正文

後面想到用 Response Header 頭來解決這個問題,就是增長一個 X-Frame-Options 的頭信息網站

X-Frame-Options: deny

X-Frame-Options: sameorigin

X-Frame-Options: allow-from https://example.com/
複製代碼
  • deny:表示該頁面不容許在 frame 中展現,即使是在相同域名的頁面中嵌套也不容許。
  • sameorigin:表示該頁面能夠在相同域名頁面的 frame 中展現。
  • allow-from URI 表示該頁面能夠在指定來源的 frame 中展現。

具體其餘的描述能夠看 X-Frame-Options 資料spa

在代碼中寫 Header 頭和在 nginx 裏面增長請求頭咱們選擇了後者。code

後面再 Nginx 裏面的 的 http 裏面增長了一個 add_header X-Frame-Options: sameorigin 後面 reloadnginx 後發現怎麼都無論用,在本地就有用。server

後面又回到了無聊的翻 nginx 文檔的時候。翻到了下面這句話。

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.

大體意思就是,若是當前級別沒有定義 add_header 則會繼承上一級,若是定義了 add_header 則不會去理會上一級。

若是這句話看不懂,下面咱們來看下面的例子。

下面在響應中返回頭信息包含什麼?

  • 一、
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    add_header A aa
    server {
        ...
        add_header B bb
    }
}
複製代碼
  • 二、
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    add_header A aa
    server {
         ...
         location ~
         {
            add_header C cc
         }
    }
}
複製代碼
  • 三、
http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;
  add_header A aa
  server {
     ...
     add_header B bb
     ...
     location ~
     {
        add_header C cc
     }
  }
}
複製代碼
  • 答案:

一、請求頭上會增長 B aa 把 A aa 放棄。

二、請求頭上會增長 C cc 把 A aa 放棄。

二、請求頭上會增長 C cc 把 A aa 和 B bb 放棄。

這個坑就是 Nginx 的繼承的一個特性,當子層級設置了 add_header,會直接不使用父級的 add_header

一樣的指令還有 add_trailerexpires

想了解更多能夠 Module ngx_http_headers_module

後語

仍是得多看文檔啊。

相關文章
相關標籤/搜索