nginx でヘッダー情報を変更できる headers-more-nginx-module
を試してみた.nginx に標準に入っている Module ngx_http_headers_module と比べて Content-Type
や Content-Length
などのビルトインヘッダーを消すことができる点にメリットがある.
This is an enhanced version of the standard headers module because it provides more utilities like resetting or clearing "builtin headers" like Content-Type, Content-Length, and Server.
ディレクティブ
headers-more-nginx-module
に含まれているディレクティブは計4個ある.
- more_set_headers
- more_clear_headers
- more_set_input_headers
- more_clear_input_headers
more_set_headers
と more_clear_headers
はレスポンスヘッダを変更できて,more_set_input_headers
と more_clear_input_headers
はリクエストヘッダを変更できる.今回は more_set_headers
と more_clear_headers
を試すことにした.試した環境は nginx 1.4.1 で結構古いけど...w
more_set_headers
more_set_headers
を使うと,レスポンスヘッダにヘッダーを追加することができる.実際には追加だけでなく,更新や削除もできる.
まず Server
を更新してみたところ Server: Apache
と返すことができた.あまりに簡単で,もはや Server
の値は信用できなさそうだなと思った.
server {
location / {
more_set_headers 'Server: Apache';
}
}
$ curl --head http://192.168.33.10 HTTP/1.1 200 OK -Server: nginx/1.4.1 Date: Mon, 09 May 2016 04:11:14 GMT Content-Type: text/html; charset=utf-8 Content-Length: 0 Last-Modified: Mon, 07 Sep 2015 07:05:50 GMT Connection: keep-alive ETag: "55ed374e-0" +Server: Apache Accept-Ranges: bytes
また以下のようなフォーマットで書くことで more_clear_headers
と同様にヘッダーを削除することができる.ちなみに nginx のバージョンを削除するなら headers-more-nginx-module
を使うまでもなく server_tokens off;
で良いかと.
- Name:
- Name
server {
location / {
more_set_headers 'Server:';
}
}
$ curl --head http://192.168.33.10
HTTP/1.1 200 OK
-Server: nginx/1.4.1
Date: Mon, 09 May 2016 04:11:14 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 0
Last-Modified: Mon, 07 Sep 2015 07:05:50 GMT
Connection: keep-alive
ETag: "55ed374e-0"
Accept-Ranges: bytes
さらに -s
と -t
オプションを付けることで,特定の Status
と Content-Type
のときに限定してヘッダーを追加することができる.以下の例だと 404
のときに限定して X-Foo
を追加している.
server { location / { more_set_headers -s 404 -t 'text/html' 'X-Foo: Bar'; } }
$ curl --head http://192.168.33.10/xxx.html
HTTP/1.1 404 Not Found
Server: nginx/1.4.1
Date: Mon, 09 May 2016 04:23:26 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 168
Connection: keep-alive
+X-Foo: Bar
more_clear_headers
次に more_clear_headers
を使うと,レスポンスヘッダからヘッダーを削除することができる.以下のように多くのヘッダーを削除することができた.
server { location / { more_clear_headers 'Server'; more_clear_headers 'Date'; more_clear_headers 'Content-Type'; more_clear_headers 'Content-Length'; more_clear_headers 'Last-Modified'; more_clear_headers 'ETag'; more_clear_headers 'Accept-Ranges'; } }
$ curl --head http://192.168.33.10 HTTP/1.1 200 OK -Server: nginx/1.4.1 -Date: Mon, 09 May 2016 04:26:43 GMT -Content-Type: text/html; charset=utf-8 -Content-Length: 0 -Last-Modified: Mon, 07 Sep 2015 07:05:50 GMT Connection: keep-alive -ETag: "55ed374e-0" -Accept-Ranges: bytes
ただし Connection
は残ってしまう.Connection
を消す場合は nginx のコア部分にパッチを当てる必要があると Limitations に書かれていた.
You cannot remove the Connection response header using this module because the Connection response header is generated by the standard ngx_http_header_filter_module in the Nginx core, whose output header filter runs always after the filter of this module. The only way to actually remove the Connection header is to patch the Nginx core, that is, editing the C function ngx_http_header_filter in the src/http/ngx_http_header_filter_module.c file.
まとめ
予約して買ったまま積読をしていた「nginx 実践入門」を今日から読んでいる.今まで nginx をちゃんと運用したことがなくて,何となく使っていたため,今回を機に形式的な知識が得られれば良いなと思っている.また同時に数多くある nginx のモジュールを試したり,lua-nginx-module
で拡張してみたりと,実践的な知識も得たいと思っている.
シンタックスハイライト
GitHub で使ってるように diff 形式でシンタックスハイライトを載せてみたけど,色が違って見慣れないなーという印象を受けた.普通に緑と赤だったら良かったのにー.