WordPress

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圧縮されてますね。

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

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

Related Category posts