CloudFront 不会使用正确的缓存控制来缓存我的 Laravel Vapor 应用程序的响应(来自 cloudfront 的缺失)

问题描述 投票:0回答:1

我有一个 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

有什么想法吗?

laravel amazon-cloudfront laravel-vapor
1个回答
0
投票

为了实现这一目标,您创建了一个名为“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 行为和分配状态。调试工具和检查标头可以帮助您深入了解缓存行为。

© www.soinside.com 2019 - 2024. All rights reserved.