如何在使用 CloudFront 函数重定向请求时包含 HTTP 请求正文?

Posted

技术标签:

【中文标题】如何在使用 CloudFront 函数重定向请求时包含 HTTP 请求正文?【英文标题】:How can I include the HTTP request body when redirecting requests with CloudFront functions? 【发布时间】:2022-01-12 04:48:54 【问题描述】:

我正在尝试向我的 CloudFront 分配添加一个行为,以将请求重定向到 my.domain/apiapi.my.domain。我尝试了常规的 /api 行为,但我从 API Gateway 收到 403 错误,因此 Reddit 用户建议我尝试 CloudFront 函数。

我能够设置 CloudFront 函数来执行重定向,但它似乎正在从我的 POST 请求中删除 HTTP 请求正文。

function handler(event) 
    var request = event.request;
    var headers = request.headers;
    var host = request.headers.host.value;
    var uri = request.uri;
    
    var newURL = 'https://api.my.domain' + uri;
    var response = 
        statusCode: 302,
        statusDescription: 'Found',
        headers:  
            "location":  "value": newURL 
        
    ;
    return response;

是否可以使用 CloudFront 函数执行此操作?还是我需要改用 Lambda@Edge?

【问题讨论】:

【参考方案1】:

我想通了 - 302 重定向会导致客户端在没有 HTTP 正文的情况下重新向新域发出 GET 请求,即使原始请求是 POST 也是如此。解决方案是使用 307 重定向来强制客户端重新向新主机发出完全相同的请求。一旦我将 302 更改为 307,一切都按预期工作。

【讨论】:

以上是关于如何在使用 CloudFront 函数重定向请求时包含 HTTP 请求正文?的主要内容,如果未能解决你的问题,请参考以下文章

CloudFront 使用路径前缀重定向所有请求

如何使用 Cloudfront 将裸域重定向到 www?

通过 AWS Lambda 和 CloudFront 重定向 URL

Cloudfront 域名无法使用 S3、Cloudfront 和 Route 53 将 HTTP 重定向到 HTTPS

cloudfront 重定向到源而不是别名

如何在 AWS S3 网站 CloudFront 中设置别名重定向?