CloudFront:使用 RoutingRule 在内部重定向到 S3 存储桶文件中的特定文件
CloudFront: Internally redirect to specific file in S3 bucket file using RoutingRule
我正在使用 AWS CDK 设置一个新的私有 S3 静态站点存储桶,并使用 CloudFront 配置为其提供服务。 S3 bucket的结构如下:
bucketname/1.2.3-SNAPSHOT/
bucketname/1.2.3-SNAPSHOT/index.html
bucketname/1.2.3-SNAPSHOT/config
bucketname/1.2.3-SNAPSHOT/config/config-dev.js
bucketname/1.2.3-SNAPSHOT/config/config-tst.js
bucketname/1.2.3-SNAPSHOT/config/config-acc.js
bucketname/1.2.3-SNAPSHOT/config/config-prd.js
例如,当我部署静态站点的 4.5.6-SNAPSHOT 版本时,会在 bucketname
S3 存储桶中创建一个新文件夹 4.5.6-SNAPSHOT。目前,index.html 包含以下内容:
<html>
<head>
<script src="https://dev.somesite.com/config/config-dev.js" />
</head>
<body>...</body>
</html>
我已经成功配置云端配置,使用 S3 destinationPrefix
将 https://dev.somesite.com/some-path 映射到 bucketname/1.2.3-SNAPSHOT/some-path
。当我导航到 https://dev.somesite.com/
时,会提供 index.html 并加载配置 js。到目前为止一切顺利。
但是,正如您在 HTML 中所见,对 config-dev.js
的引用仍然是硬编码的。我希望 CloudFront 配置在内部(不是 30x)将调用 https://dev.somesite.com/config/config.js
重定向到 bucketname/1.2.3-SNAPSHOT/config/config-dev.js
。我曾尝试使用 KeyPrefixEquals
和 ReplaceKeyWith
值的多样性来设置 RoutingRule
,但无济于事。我正在尝试设置一个类似于 this 的配置(示例 2)。
我的 CDK 脚本生成以下路由规则:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>1.2.3-SNAPSHOT/config</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyWith>1.2.13-SNAPSHOT/config/config-dev.js</ReplaceKeyWith>
</Redirect>
</RoutingRule>
</RoutingRules>
但是,对 https://dev.somesite.com/config/anything
的调用不会被重定向到所需的配置-dev.js 文件。有人知道解决这个问题的最佳方法吗?设置 RoutingRule 是正确的方法吗?
[编辑]
我使用 S3 destinationPrefix=1.2.3-SN
设置来确保将新文件夹上传到存储桶 bucketName
中的新目标(前缀)文件夹“1.2.3-SN”中。同时,我已将 CloudFront 的 originPath
配置为 /1.2.3-SN
以确保将文件夹设置为 "root" 文件夹。这按预期工作;导航到 https://dev.somesite.com/ 会导致 bucketname/1.2.3-SN/index.html
被提供。
我想要完成的是能够 "rerouting" 对 https://dev.somesite.com/config/**.js 的任何调用都位于 bucketname/1.2.3-SN/config
中的单个配置文件。我这样做的原因是为了确保 index.html 中的脚本引用不需要根据环境进行更改,同时屏蔽掉当前环境中不需要的其他配置文件。
您可以 运行 CloudFront 边缘的 Lambda 函数。它被称为 lambda@edge
当CDN得到一个请求(Viewer request),你可以设置很多东西比如:
- 转发到特定的桶
- 设置响应headers
- ...
相信这就是您所需要的。
我正在使用 AWS CDK 设置一个新的私有 S3 静态站点存储桶,并使用 CloudFront 配置为其提供服务。 S3 bucket的结构如下:
bucketname/1.2.3-SNAPSHOT/
bucketname/1.2.3-SNAPSHOT/index.html
bucketname/1.2.3-SNAPSHOT/config
bucketname/1.2.3-SNAPSHOT/config/config-dev.js
bucketname/1.2.3-SNAPSHOT/config/config-tst.js
bucketname/1.2.3-SNAPSHOT/config/config-acc.js
bucketname/1.2.3-SNAPSHOT/config/config-prd.js
例如,当我部署静态站点的 4.5.6-SNAPSHOT 版本时,会在 bucketname
S3 存储桶中创建一个新文件夹 4.5.6-SNAPSHOT。目前,index.html 包含以下内容:
<html>
<head>
<script src="https://dev.somesite.com/config/config-dev.js" />
</head>
<body>...</body>
</html>
我已经成功配置云端配置,使用 S3 destinationPrefix
将 https://dev.somesite.com/some-path 映射到 bucketname/1.2.3-SNAPSHOT/some-path
。当我导航到 https://dev.somesite.com/
时,会提供 index.html 并加载配置 js。到目前为止一切顺利。
但是,正如您在 HTML 中所见,对 config-dev.js
的引用仍然是硬编码的。我希望 CloudFront 配置在内部(不是 30x)将调用 https://dev.somesite.com/config/config.js
重定向到 bucketname/1.2.3-SNAPSHOT/config/config-dev.js
。我曾尝试使用 KeyPrefixEquals
和 ReplaceKeyWith
值的多样性来设置 RoutingRule
,但无济于事。我正在尝试设置一个类似于 this 的配置(示例 2)。
我的 CDK 脚本生成以下路由规则:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>1.2.3-SNAPSHOT/config</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyWith>1.2.13-SNAPSHOT/config/config-dev.js</ReplaceKeyWith>
</Redirect>
</RoutingRule>
</RoutingRules>
但是,对 https://dev.somesite.com/config/anything
的调用不会被重定向到所需的配置-dev.js 文件。有人知道解决这个问题的最佳方法吗?设置 RoutingRule 是正确的方法吗?
[编辑]
我使用 S3 destinationPrefix=1.2.3-SN
设置来确保将新文件夹上传到存储桶 bucketName
中的新目标(前缀)文件夹“1.2.3-SN”中。同时,我已将 CloudFront 的 originPath
配置为 /1.2.3-SN
以确保将文件夹设置为 "root" 文件夹。这按预期工作;导航到 https://dev.somesite.com/ 会导致 bucketname/1.2.3-SN/index.html
被提供。
我想要完成的是能够 "rerouting" 对 https://dev.somesite.com/config/**.js 的任何调用都位于 bucketname/1.2.3-SN/config
中的单个配置文件。我这样做的原因是为了确保 index.html 中的脚本引用不需要根据环境进行更改,同时屏蔽掉当前环境中不需要的其他配置文件。
您可以 运行 CloudFront 边缘的 Lambda 函数。它被称为 lambda@edge 当CDN得到一个请求(Viewer request),你可以设置很多东西比如:
- 转发到特定的桶
- 设置响应headers
- ...
相信这就是您所需要的。