LaravelでAPIの結果をCloudFrontでキャッシュさせようとしてハマった話【#np2020】

先日用意したAmazon API(Amazon Product Advertising API)を利用したAPIを、リクエスト数節約のためにCloudFrontでキャッシュさせようとしたんだけど、どう設定してもキャッシュしてくれなくてハマってました。見直す中でCloudFrontの設定に間違いもあってそれで混乱してしまったのですが、どうやら設定のせいじゃない。APIの取得結果をJSONで返すだけだからCookieも使っていないし、なぜキャッシュされないのか……

と思いながら冷静になってChromeのデベロッパーツールでリクエスト見てたらこんなんなってました。



ss_2019-05-17_101127.png

あ、これあかんやつやん。



Laravelの設定でした


Laravelでは、レスポンスのCache-Controlヘッダーがデフォルトでは no-cache, private で返るみたいなんだけど、キャッシュしてもいいAPIでは設定変えたかったのでその方法。

ググると自前でミドルウェア作って~みたいな情報も出てくるけど、結論からいうとLaravel 5.6からSetCacheHeadersというミドルウェアが標準で用意されているので、今はこれを↓みたいに有効にするだけでよい。

LaravelでCache-Controlヘッダーを設定する – honeplusのメモ帳


マジッスか。

設定の仕方は上の記事にある方法でもいいし、対象が少ないならこんな感じでもいい。




おおお、確かにキャッシュされた。デフォルトで明確にキャッシュオフが設定されていて、必要なときだけオンにするっていうことなのね。そうだったのか。