ボディを書き換える
ボディフィルタは、nginxがレスポンスを送る間に動きます。レスポンスを作ったのがどのハンドラでも、upstreamでも同じです。mruby_output_body_filterを使うと、RubyのスクリプトはNginx::Filter#bodyでボディを読み、Nginx::Filter#body=でボディを置き換えます。ヘッダフィルタのmruby_output_header_filterはその前に動き、レスポンスのヘッダを変えられます。
このlocationは、ディスクにあるテキストファイルを送ります。ヘッダフィルタはContent-Typeをtext/htmlにし、ボディフィルタは&、<、>をエスケープして、テキストをHTMLのページで包みます。
server { listen 18167;
# A text file from disk, sent as an HTML page. location = /notes { alias html/guide_notes.txt; mruby_output_header_filter_code 'Nginx::Request.new.content_type = "text/html"'; mruby_output_body_filter build/nginx/html/guide_body_filter.rb; }}f = Nginx::Filter.newtext = f.body.gsub("&", "&").gsub("<", "<").gsub(">", ">")f.body = "<!doctype html>\n<title>notes</title>\n<pre>\n#{text}</pre>\n"GET /notes HTTP/1.1Host: 127.0.0.1:18167Connection: closeHTTP/1.1 200 OKContent-Type: text/html
<!doctype html><title>notes</title><pre>Notes from disk.The filter escapes <b> and &.</pre>CIが動くたびに、ケースのtest/t/cases/guides.rbがこのリクエストを送ります。ケースは、ステータス行、ここに載せたヘッダ、ボディ全体を比べます。5個のファイルを最後に変えたのは、2026-10-29のコミット32219e53です。
気をつけること
Section titled “気をつけること”- ボディフィルタは、ディスクのファイルのような長さの分かるレスポンスを、1つのバッファとして読みます。
Content-Lengthの無いレスポンスは、フィルタが読まないまま、nginxが先へ渡します。詳しくはNginx::Filter にあります。 - ngx_mrubyは、新しいボディの長さを
Content-Lengthに入れて送ります。 - ユースケースのMarkdownをHTMLに変換する出力フィルタは、同じ場所で、gemのmruby-discountを使ってMarkdownを変換します。