【问题标题】:How can I force origin request inside Lambda@Edge Viewer Request event if URL contains certain query parameter如果 URL 包含某些查询参数,我如何在 Lambda@Edge 查看器请求事件中强制源请求
【发布时间】:2021-03-21 05:45:28
【问题描述】:

我将 CloudFront 缓存行为配置为缓存路径模式 /posts 下的所有页面。缓存行为是从 WordPress 网站的自定义来源获取内容。我需要根据请求 url 的特定查询参数的存在来实现自定义缓存逻辑。具体来说,如果请求 url 包含查询参数?preview=true,那么我想将该 Viewer Request 转发到 Origin 以获取动态生成的页面,无论该请求是否已被缓存。

我应该在我的 nodejs lambda 边缘函数中编写什么代码来处理查看器请求事件的以下场景:

  1. 请求 url 包含 ?preview=true 参数,因此即使请求已缓存在 CloudFront 中,也始终强制执行源请求
  2. 请求url不包含?preview=true参数且响应已缓存在CloudFront中,所以只需从缓存中返回响应
  3. 请求 url 不包含 ?preview=true 参数,响应尚未缓存在 CloudFront 中,因此将请求转发到源

我有提供的逻辑结构,但我不知道 CloudFront 特定的代码:

 const querystring = require('querystring');
 
 exports.handler = (event, context, callback) => {
     const request = event.Records[0].cf.request;
     const params = querystring.parse(request.querystring);
    
     if (params['preview'] && params['preview'] === 'true') {
        // Force request to the origin
     } else {
         // Check if request is cached in CloudFront and 
         // - Return response if request is cached
         // - Forwrd to origin if request is not cached
     }
     
    callback(null, request);
};

【问题讨论】:

    标签: lambda aws-lambda amazon-cloudfront aws-lambda-edge


    【解决方案1】:

    我终于想出了自己的解决方案,实际上非常简单。当我检测到我想将请求强制转发到源时,我所要做的只是将一个额外的查询参数附加到 url,该参数将具有一个唯一值,我选择为其添加当前时间戳。 然后我转到我的 CloudFront 缓存行为并将新附加的查询参数的名称列入白名单,以便通过 CloudFront 将其传递到源服务器。 这有效地迫使 CloudFront 在 url 包含 preview 查询字符串时从源服务器获取内容。以下是完整代码供参考:

    'use strict';
    
     const querystring = require('querystring');
     
     exports.handler = (event, context, callback) => {
         const request = event.Records[0].cf.request;
         const params = querystring.parse(request.querystring);
         
         if (params['preview'] && params['preview'] === 'true') {
          params['le-preview-timestamp'] = new Date().getTime();
          request.querystring = querystring.stringify(params);
         }
         
         callback(null, request);
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2019-08-03
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      相关资源
      最近更新 更多