Lambda@Edge 函数的 Node.Js 301 url-rewrite 问题

Posted

技术标签:

【中文标题】Lambda@Edge 函数的 Node.Js 301 url-rewrite 问题【英文标题】:Node.Js 301 url-rewrite issues for Lambda@Edge function 【发布时间】:2020-06-24 21:04:17 【问题描述】:

将我的静态站点移动到新域,同时需要从站点上的每个 url 中删除最后一个斜杠,并使用 Lambda 函数发送 301 响应。它应该是这样的:

oldsite.com/any-page/ 将变为 newsite.com/any-page

我找到了一个代码示例来帮助我更改域,但是现在旧站点上的每个页面都会指向新站点的主页,而忽略更改路径功能。

这是我现在使用的代码,路径切换不正确:

'use strict';
exports.handler = (event, context, callback) => 
  /*
   * Generate HTTP redirect response with 301 status code and Location header.
   */

   const request = event.Records[0].cf.request;

   // get the original URL path
   const path = request.uri
   const baseURI = 'https://newsite.com'
// construct the response
   const response = 
      status: '301',
      statusDescription: 'Found',
      headers: 
          location: [
              key: 'Location',
              value: baseURI,
          ],
      ,
  ;
// Configure the URL redirects
  switch(path) 
    case /\/.*\//:
      response.headers.location[0].value = baseURI + /\/.*/;
    break;

    default:
      response.headers.location[0].value = baseURI;
   

  callback(null, response);
;

当我尝试实际路径时,这里的罪魁祸首似乎是正则表达式:

switch(path) 
    case '/foo/':
      response.headers.location[0].value = baseURI + '/foo';
    break;

它完美地工作并进行了切换。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

在挖掘和玩弄之后,我管理了一个实际的代码,它可以工作并且看起来比原来的代码更有效率。它似乎为我完成了这项工作,至少对于这个特定的用例。我可能会根据需要添加更多条件。

'use strict';
exports.handler = (event, context, callback) => 
  /*
   * Generate HTTP redirect response with 301 status code and Location header.
   */

   const request = event.Records[0].cf.request;

   // get the original URL path
   const baseURI = 'https://newsite.com'
   const path = request.uri.replace(/\/$/, '')
   const newURI = baseURI+path
// construct the response
   const response = 
      status: '301',
      statusDescription: 'Found',
      headers: 
          location: [
              key: 'Location',
              value: newURI,
          ],
      ,

  ;

  callback(null, response);
;

【讨论】:

以上是关于Lambda@Edge 函数的 Node.Js 301 url-rewrite 问题的主要内容,如果未能解决你的问题,请参考以下文章

无法删除 AWS Lambda@Edge 副本

Lambda@Edge 未登录云端请求

AWS lambda 和 AWS Lambda@EDGE 有啥区别?

如何在使用 lambda@edge 调整图像大小时修复访问被拒绝错误

将带有 nonce 的 CSP 标头添加到 Lambda Edge

如何添加 CloudFront 作为 lambda 函数的触发器?