2026年9月30日

2026年9月30日

WordPressのGZIP圧縮を有効化する方法・テキストファイルを圧縮して高速化

はじめに

「PageSpeed InsightsでテキストベースのリソースをGZIPで圧縮してくださいと言われた」「HTMLやCSS・JSの転送量を削減したい」——GZIP圧縮はサーバーが送信するテキストデータを圧縮することで、転送量を60〜80%削減し表示速度を改善します。

症状・原因

GZIP圧縮が無効になっていると、WordPressが出力するHTML・CSS・JS・XMLなどのテキストデータが非圧縮で転送されます。特にモバイル回線では転送量の削減がページ速度に直結します。ほとんどのモダンブラウザはGZIPに対応しており、サーバー側で設定するだけで効果を発揮します。

解決手順

ステップ1:GZIP圧縮の有効化を確認する

# curlでGZIP対応を確認
curl -I -H "Accept-Encoding: gzip" https://example.com | grep -i "content-encoding"
# → content-encoding: gzip  が返ればGZIP有効

# または Chrome DevTools で確認
# F12 → Network → 任意のリクエストを選択
# → Response Headers の Content-Encoding: gzip を確認

# オンラインツールで確認
# GZipWTF: gzipwtf.com
# Check GZIP: checkgzipcompression.com

ステップ2:Apache(.htaccess)でGZIPを有効化する

# .htaccess: mod_deflateでGZIP圧縮を設定
<IfModule mod_deflate.c>
    # 圧縮するMIMEタイプを指定
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/json
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/atom+xml
    AddOutputFilterByType DEFLATE image/svg+xml
    AddOutputFilterByType DEFLATE font/woff2
    AddOutputFilterByType DEFLATE font/woff

    # 古いブラウザ向けのブラウザ別設定
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

    # すでに圧縮済みのファイルは除外
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|avif|zip|gz|bz2)$ no-gzip dont-vary
    Header append Vary User-Agent env=!dont-vary
</IfModule>
# mod_filterを使う方法(推奨、Apache 2.4+)
<IfModule mod_filter.c>
    FilterDeclare COMPRESS
    FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m|text/html|i"
    FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m|text/css|i"
    FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m|application/javascript|i"
    FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m|application/json|i"
    FilterChain COMPRESS
    FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no
</IfModule>

ステップ3:NginxでGZIP/Brotliを有効化する

# nginx.conf: GZIPを有効化
http {
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;   # 圧縮レベル(1-9、6が品質とCPU負荷のバランス)
    gzip_min_length 256; # 256バイト以上のファイルを圧縮
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/json
        application/javascript
        application/xml
        application/rss+xml
        image/svg+xml
        font/woff2
        font/woff;
}
# Brotli圧縮(GZIPより高効率、ngx_brotliモジュールが必要)
http {
    brotli on;
    brotli_comp_level 6;
    brotli_types
        text/plain
        text/css
        application/json
        application/javascript
        image/svg+xml
        font/woff2;
}

ステップ4:PHPでGZIP出力を有効化する

// wp-config.php または functions.php
// ※ サーバーのGZIPが設定できない場合の代替手段

// PHPのob_gzhandlerを使ってGZIPを有効化
if ( ! is_admin() && extension_loaded( 'zlib' ) ) {
    ob_start( 'ob_gzhandler' );
}

// または .htaccessが使えない場合にphp.iniで設定
// zlib.output_compression = On
// zlib.output_compression_level = 6

// WordPressのwp-config.phpでは以下の定数で制御
define( 'COMPRESS_SCRIPTS', true );  // JS圧縮
define( 'COMPRESS_CSS', true );      // CSS圧縮
define( 'ENFORCE_GZIP', true );      // GZIP強制

ステップ5:圧縮効果を確認してブラウザキャッシュと組み合わせる

# .htaccess: GZIPとブラウザキャッシュを組み合わせる
# GZIPと合わせてVaryヘッダーを設定
<IfModule mod_headers.c>
    # 圧縮されたレスポンスをキャッシュさせる
    <FilesMatch "\.(css|js|html)$">
        Header append Vary: Accept-Encoding
    </FilesMatch>

    # 静的ファイルのブラウザキャッシュ
    <FilesMatch "\.(css|js)$">
        Header set Cache-Control "public, max-age=2592000"
    </FilesMatch>
    <FilesMatch "\.(woff2|woff)$">
        Header set Cache-Control "public, max-age=31536000"
    </FilesMatch>
</IfModule>
# 圧縮率の確認(ファイルサイズ比較)
# 圧縮前
curl -o /dev/null -s -w "%{size_download}" https://example.com/wp-content/themes/my-theme/style.css

# 圧縮後
curl -H "Accept-Encoding: gzip" -o /dev/null -s -w "%{size_download}" https://example.com/wp-content/themes/my-theme/style.css

# 典型的な圧縮率: CSSは60-70%、HTMLは70-80%、JSは60-75%削減

注意事項

  • すでに圧縮されている画像(JPEG・PNG・WebP)やPDFをGZIP対象にしても効果はなく、むしろCPU負荷が増えます。SetEnvIfNoCaseディレクティブで画像ファイルを除外してください。
  • PHP(ob_gzhandler)とApache(mod_deflate)の両方でGZIPを有効にすると二重圧縮が発生してエラーになる場合があります。どちらか一方のみを使ってください。
  • Cloudflare CDNを使用している場合は、Cloudflareが自動でGZIP/Brotli圧縮を行います。この場合はオリジンサーバー側のGZIP設定と競合しないよう確認してください。

まとめ

GZIP圧縮の有効化は「.htaccessにmod_deflate設定→NginxならGZIP/Brotli設定→圧縮確認ツールで動作確認→Varyヘッダーでキャッシュと組み合わせ」の流れで設定します。転送量が60〜80%削減され、特にモバイルユーザーの体験が大きく改善します。関連記事:WordPressのサイト速度を計測して改善する方法、WordPressでHTTP/2を活用してパフォーマンスを改善する方法。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲