WP APIのレスポンスをCloudFrontでgzip圧縮する

CloudFrontには自動でレスポンスをgzip圧縮してくれる機能があります。 が、オリジンからのレスポンスにContent-Lengthヘッダーがないと動かないという制限があるために実はWordPressの場合一部機 […]

広告ここから
広告ここまで

目次

    CloudFrontには自動でレスポンスをgzip圧縮してくれる機能があります。

    が、オリジンからのレスポンスにContent-Lengthヘッダーがないと動かないという制限があるために実はWordPressの場合一部機能しないことがあります。

    サイト全体であれば、ob_start / ob_end_flusをテーマに書いて使う方法がこちらの記事で紹介されています。

    WordPress サイトを CloudFront で配信すると compress オプションを設定していても圧縮転送されない…

    うちはHeadlessでやっている関係上、WP APIのレスポンスだけできればいいので、以下のコードをいれました。

    add_filter('rest_post_dispatch', function ( $result ) {
        if ( $result->get_status() === 200 ) {
          $result->header('Content-Length',strlen( json_encode( $result->get_data() ) ));
        }
        return $result;
    });

    rest_post_dispatchフィルターでWP_REST_Responseオブジェクトを拾い、get_dataのJSON化したものをカウントしてヘッダーに追加しています。

    デバッグがめんどくさかったGETのレスポンスだけ圧縮してくれればとりあえずOKだったので、今回はget_status()でHTTP 200のものだけカウントするようにしています。

    変更後

    CloudFrontでのキャッシュ前でもgzip圧縮されてますね。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark