我有一个 Laravel 应用程序通过 Vapor 部署到 AWS。我需要将我的 api 端点的响应之一缓存在 CloudFront 中,因此我创建了以下简单的中间件:
class CacheResponse
{
public function handle(Request $request, Closure $next, int $maxAge): mixed
{
$response = $next($request);
$response->header('Cache-Control', "public, max-age={$maxAge}");
$response->header('Pragma', "public");
return $response;
}
}
然后注册中间件:
protected $middlewareAliases = [
...
'cache-response' => \App\Http\Middleware\CacheResponse::class,
];
最后我使用了这样的中间件:
Route::get('some/endpoint', [MyController::class, 'myMethod'])
->middleware('cache-response:300');
部署更改后,我点击应用程序的 api 端点(多次),并且 CloudFront 似乎没有按照指示缓存 api 响应。这是我收到的响应标头:
Access-Control-Allow-Origin: *
Cache-Control: max-age=300, public
Content-Length: 27
Content-Type: application/json
Date: Fri, 01 Sep 2023 02:05:07 GMT
Pragma: public
Via: 1.1 55cf94331c5a848a09407c283669c546.cloudfront.net (CloudFront)
X-Amz-Apigw-Id: KjgBCG7pIAMF5uw=
X-Amz-Cf-Id:552YO9QGBl47xgpFH4XkGotHMO97dVTYkyJYhYFLtx2ofl7_0iFRJA==
X-Amz-Cf-Pop: LHR62-C2
X-Amzn-Remapped-Date: Fri, 01 Sep 2023 02:05:07 GMT
X-Amzn-Requestid: 17b394fa-83bc-4fac-a91a-0214b841a7ed
X-Amzn-Trace-Id: Root=1-64f146d3-562460c90fcd8ed06eb52c84;Sampled=0;lineage=9fbc8014:0
X-Cache: Miss from cloudfront
有什么想法吗?
为了实现这一目标,您创建了一个名为“CacheResponse”的中间件,它设置适当的 Cache-Control 和 Pragma 标头。尽管您付出了努力,您还是注意到 CloudFront 似乎没有按预期缓存 API 响应。
检查响应标头后,您可以看到 Laravel 应用程序正确添加了“Cache-Control”和“Pragma”标头来指示缓存。但是,CloudFront 仍然显示“X-Cache: Miss from cloudfront”,表明 CloudFront 未提供缓存响应。
造成此行为的可能原因包括 CloudFront 配置问题、Laravel 和 CloudFront 设置之间的 TTL 不匹配、影响缓存行为的先前未缓存请求、阻止缓存的特定标头或干扰缓存的其他 CloudFront 设置。
为了解决此问题,您可能需要验证 CloudFront 分配配置,确保一致的 TTL 设置,考虑使缓存失效,检查可能影响缓存的任何标头,并检查 CloudFront 行为和分配状态。调试工具和检查标头可以帮助您深入了解缓存行为。