我有一个 S3 存储桶,其中根目录中的每个文件夹都包含一个网站,文件夹名称就是网站 url。我有一个 Cloudfront 分配,将此存储桶作为源,并有一个与源请求分配关联的 Lambda Edge 函数。在该函数中,我想获取原始请求的 url 并将其添加到原始请求中作为 S3 存储桶的路径键。我该怎么做?
在事件请求中我看到这些字段:
'origin': {'custom': {'customHeaders': {}, 'domainName': '<bucketName>.s3-website-us-east-1.amazonaws.com', 'keepaliveTimeout': 5, 'path': '', 'port': 80, 'protocol': 'http', 'readTimeout': 30, 'sslProtocols': ['TLSv1', 'SSLv3']}}, 'querystring': '', 'uri': '/'
我尝试将原始请求的url设置为['origin']['custom']中的路径,作为查询字符串或uri,并将其附加到['origin']['custom']中的域名,但没有已经工作了。添加为查询字符串或 uri 返回“指定的存储桶不存在”,添加为路径返回“无效路径”,添加到域名返回“无效域名”。
感谢您的帮助!
如果我正确理解你的问题,我认为你修改了错误的字段。 活动内部需要改变的地方不是
origin
,而是request
。
基本上你需要改变uri
内部的event['Records'][0]['cf']['request']
,然后return request
我的问题的解决方案是将原始请求的 url(S3 存储桶路径)设置为请求中的 uri,如 @vpereira 提到的。此外,我通过将主机标头转发到原始请求来获取原始请求的 url,因此在检索到原始请求的 url 后,我需要将主机标头更改回 S3 存储桶的 url。第二部分有更多描述这里。
代码解决方案:
def lambda_handler(event, context):
request = event['Records'][0]['cf']['request']
# Get original host header
requested_url = request['headers']['host'][0]['value']
# Set original host header as uri
request['uri'] = '/' + requested_url + request['uri']
# Set host header to bucket url
request['headers']['host'][0]['value'] = '<bucketName>.s3-website-<region>.amazonaws.com'
return request