Cloudfront + ELB 可以更改我的请求的查询字符串吗?

Posted

技术标签:

【中文标题】Cloudfront + ELB 可以更改我的请求的查询字符串吗?【英文标题】:Can Cloudfront + ELB change the query string of my request? 【发布时间】:2021-05-27 11:18:51 【问题描述】:

我们正在 AWS 上运行一个 React Web 应用程序。 Web 应用程序由 S3 存储桶托管,API 位于弹性 beanstalk 上。我们使用 Cloudfront 将其整合到单个域中。

到目前为止一切顺利。网站加载完毕,它可以与 API 对话。

问题是,所有到达我们的弹性 beanstalk 实例的 API 请求在查询字符串中仍然有 /api。这对我们的 API 来说很好,因为我们可以控制它,但是我们正在部署一个 tileserver-gl 的实例,它不允许我们配置要从其提供服务的根 url。

我似乎无法配置 Cloudfront 来修改查询字符串以删除第一部分。例如。这样mysite.com/api/v1/users 就会映射到fj935hf02.elasticbeanstalk.com/v1/users

其他人是如何绕过这个问题的?

【问题讨论】:

你不能从源头做到这一点吗? 你是什么意思?如果源请求除 /api 之外的任何内容,则该请求将不会到达 API 服务器。 哦,我的错!!!! 【参考方案1】:

是的,CloudFront 可以通过Lamdba@edge 进行类似的修改。具体来说,您可以查看Origin request 函数,该函数可以修改传递给源的内容。

AWS 还提供了examples 的此类功能。 One 的示例展示了如何使用查询字符串。

'use strict';

const querystring = require('querystring');
exports.handler = (event, context, callback) => 
    const request = event.Records[0].cf.request;
    
    /* When a request contains a query string key-value pair but the origin server
     * expects the value in a header, you can use this Lambda function to
     * convert the key-value pair to a header. Here's what the function does:
     * 1. Parses the query string and gets the key-value pair.
     * 2. Adds a header to the request using the key-value pair that the function got in step 1.
     */

    /* Parse request querystring to get javascript object */
    const params = querystring.parse(request.querystring);

    /* Move auth param from querystring to headers */
    const headerName = 'Auth-Header';
    request.headers[headerName.toLowerCase()] = [ key: headerName, value: params.auth ];
    delete params.auth;

    /* Update request querystring */
    request.querystring = querystring.stringify(params);

    callback(null, request);
;

【讨论】:

谢谢!你有使用 Lamda@Edge 做这种事情的经验吗?你知道哪些陷阱? @Hannesh Lambda@Edge 不是免费的,与常规 lambda 相比有很多限制。但是如果要修改标头或查询字符串,我不知道 CloudFront 有什么其他方式。

以上是关于Cloudfront + ELB 可以更改我的请求的查询字符串吗?的主要内容,如果未能解决你的问题,请参考以下文章

Amazon CloudFront 未针对未更改的静态内容始终返回 304(未修改)?

HTTPS、AWS ELB、CloudFront 和 S3

Cloudfront 在连接到 ELB/Elastic Beanstalk 时抛出 504

我应该为 elb 和 aws S3 设置两个不同的 Cloudfront 发行版吗?

Cloudfront、ELB 和 SSL

使用 ELB 的 Cloudfront 中的 SSL 问题