Brotliでデータ圧縮、記述例
ウェブサイトからクライアント側へデータ(ファイル)を転送する際の圧縮方式 Brotli を .htaccess に記述する例。
ここでは VPS でウェブサーバーを構築し、Brotli を使用する場合も想定している。 環境は Rocky Linux 9。 yum を使い httpd(Apache)をインストールした場合。
Apache公式サイト Brotli / mod_brotli(Apache) に詳しい解説がある。
DEFLATE(gzip)については DEFLATE(gzip)で圧縮する をご覧下さい。
動作要件
Apache で Brotli を使うには以下の要件がある。
- Apache の Brotli モジュール(mod_brotli)がインストールされている。Apache 2.4.26 以上。
- HTTP/2 の通信。
- HTTPS の通信(SSL証明書)。
mod_brotli がインストールされていても HTTP/2 と HTTPS の要件が満たされていないと Brotli が有効にならない。 エラーは出ないが圧縮が効かない。
以下のコマンド(Linux)でインストールされているモジュールが確認できる。
httpd -M
httpd は、環境によるが HTTP/2 が使えてもデフォルトでは HTTP/1.1 になっている場合がある。 httpd.conf や .htaccess など記述する場所は自由だが、以下のように HTTP/2 になるように Protocols h2 を追記する。
Protocols h2 http/1.1
HTTPS の通信は、Let's Encrypt など各自インストールしてSSL証明書が有効な状態にする。 これも VPS では httpd.conf などの設定が必要だが、ここでは割愛する。
なお、Brotli で圧縮したデータを展開するには、ブラウザが Brotli に対応している必要がある。 ただ、現在最新のブラウザなら全て対応している。
Brotliの記述例
記述の仕方は DEFLATE(gzip)と似ている。
記述場所は httpd.conf や .htaccess など自由。 /etc/httpd/conf.d/ ディレクトリ以下にサイトごとに example.com.conf のように設定ファイルを用意し、そこに記述するのが分かりやすいかもしれない。
以下のように記述する。
<IfModule mod_brotli.c> SetOutputFilter BROTLI_COMPRESS SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico|webp|avifs?)$ no-brotli dont-vary </IfModule>
1行目の <IfModule mod_brotli.c> から </IfModule> までは、mod_brotli がインストールされている場合のみ実行される。 インストールされているのが分かっているなら、あえて書かなくても良い。
2行目の SetOutputFilter BROTLI_COMPRESS により Brotli で全てのデータを圧縮する。
3行目の SetEnvIfNoCase Request_URI 以降は、GIF、JPEG、PNG などの画像データは圧縮しないという指定。 ここでは拡張子で指定している。 SVG は画像だが、中身はテキストなので圧縮すると基本的にファイルサイズは小さくなる。
また、以下のようにMIMEタイプ(Content-Type)ごとに書くこともできる。
<IfModule mod_brotli.c> AddOutputFilterByType BROTLI_COMPRESS text/html </IfModule>
上記の場合、MIMEタイプ(Content-Type)が text/html のデータのみ圧縮する。
SetOutputFilter と AddOutputFilterByType を同時に書いている例も見られるが、AddOutputFilterByType のみで有効になる。
以下のように複数のMIMEタイプを指定することもできる。
<IfModule mod_brotli.c> AddOutputFilterByType BROTLI_COMPRESS text/html AddOutputFilterByType BROTLI_COMPRESS text/css AddOutputFilterByType BROTLI_COMPRESS application/javascript </IfModule>
MIMEタイプを複数指定する場合、スペース区切りで1行で書くこともできる。
<IfModule mod_brotli.c> AddOutputFilterByType BROTLI_COMPRESS text/html text/css application/javascript </IfModule>
ウェブサイトでよく使うデータ(ファイル)としては以下のようなものがある。 ただし、SVG以外の画像を除く。 環境によってMIMEタイプが異なる場合がある。
| 主なデータ | MIMEタイプ |
| HTML | text/html |
| CSS | text/css |
| JavaScript | text/javascript |
| JavaScript | application/javascript |
| SVG | image/svg+xml |
| XML、RSSなど | application/xml |
| テキスト | text/plain |
特定のページのみ圧縮を除外する
上記例で画像のみBrotliの圧縮を除外したが、特定のページ(PHPのプログラムなど)も個別に除外できる。 以下は example.php を Brotli で圧縮しない例。
SetEnvIfNoCase Request_URI example\.php$ no-brotli dont-vary
動作確認
ブラウザのデベロッパーツールを使って動作しているか確認する。 デベロッパーツールの「ネットワーク」を選択した状態でサイトのページを読み込むと Content-Encoding に圧縮方式が表示される。 Brotli の場合は「br」と表示される。