隱藏/修改 Nginx 的 Server Header

如何透過 nginx 官方預設功能與 openresty 的 headers-more-nginx-module 來客製化 response 的 server header。

預設設定下經由 nginx 回傳的 HTTP 封包其 header 都會加上 server 欄位,由 nginx + 版本號組成。

nginx 預設的 response header

那麼有甚麼方法可以隱藏伺服器資訊呢?這裡要先來介紹 server_tokens 這個功能(官方說明)。

初階方法

server_tokens 共有四種方法可以設定 on、off、build 和 stirng。

使用情形

on (預設)

預設值,沒有特別設定即使用此選項。

server_tokens on;

server : nginx/1.18.0

off

可以隱藏版本資訊,但還是會顯示出 nginx。

server_tokens off;

server : nginx

build

在我的環境中和 on 的結果一樣。

server_tokens build;

server : nginx/1.18.0

string 要訂閱商業版才能使用,其功能可以自訂訊息,輸入空字串可以禁用 server 欄位。

如果沒有訂閱商業版,卻也想要有自訂 server 標頭的功能該怎麼做呢?

進階方法

那就只能靠第三方模組啦,這次要來介紹 openresty 所開發的 headers-more-nginx-module,它可以用來設置和清除 header,拿來實現我們的需求綽綽有餘。

安裝

畢竟是第三方模組要拿來使用只能自己編譯,所幸它可以編成動態庫讓我們使用,接下來講解編譯方法。

安裝需求套件

以 Ubuntu 20.04 為例

sudo apt install build-essential libpcre3-dev zlib1g-dev

下載 nginx 原始碼

這裡需要下載和你使用的 nginx 同版本的原始碼

查看版本命令

nginx -v

知道版本後就可以進行下載了(以下用版本 1.18.0 作為範例)

下載

curl -O http://nginx.org/download/nginx-1.18.0.tar.gz

解壓縮

tar -xzf nginx-1.18.0.tar.gz

下載 headers-more-nginx-module 原始碼

git clone https://github.com/openresty/headers-more-nginx-module

開始編譯

切換到原始碼目錄

cd nginx-1.18.0

設定編譯選項

./configure --add-dynamic-module=../headers-more-nginx-module --with-compat

編譯模組

make modules

複製動態庫到模組目錄

nginx 的模組目錄可以用以下指令查看

nginx -V 2>&1 | grep modules-path

接在 modules-path= 後面的就是我們要的路徑,我的環境下為 /usr/lib/nginx/modules/。

複製

sudo cp objs/ngx_http_headers_more_filter_module.so /usr/lib/nginx/modules/

隱藏伺服器資訊

headers-more-nginx-module 有很多實用的功能,不過這裡只著重如何設定 server 標頭。

以下操作修改 nginx 的設定,可以在在 /etc/nginx/modules-enabled/ 新增 .conf 檔或是直接在 /etc/nginx/nginx.conf 寫入

載入模組

# 載入 ngx_http_headers_more_filter_module.so 自訂標頭
load_module modules/ngx_http_headers_more_filter_module.so;

禁用 server 標頭

more_clear_headers "server";

more_clear_headers 後面接的字串即為要拿掉的標頭。

自訂 server 標頭

當然我們也可以打造專屬自己的酷炫 server 標頭

more_set_headers "server: super web server";

修改後伺服器回傳的 HTTP 標頭 server 欄位變成了 super web server

more_clear_headers 修改後的 header response

Built with Hugo
Theme Stack designed by Jimmy