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