如何向 Cloudfront 添加查询字符串参数?

How to add a query string parameter to Cloudfront?

我想向我的 Cloudfront Url 添加一个查询字符串参数,以便能够在 Cloudfront 日志中获取一些额外的信息。我有两个发行版,一个有签名,一个没有签名,指向两个不同的 S3 存储桶(一个有音频,一个有图像)。 在不添加查询字符串的情况下访问这两个发行版都可以正常工作,但是如果我添加一个查询参数,如下面的测试参数:

https://x.cloudfront.net/audio.m4a?li=...62&Expires=1544430879&Signature=...QTQ__&Key-Pair-Id=xxx&test=fail

https://y.cloudfront.net/image.jpg?test=allgood

第一个失败(拒绝访问)但第二个工作正常。 没有一个分发版将查询字符串转发到 S3。

签名的音频分发启用了日志记录,而图像分发没有日志记录。除此之外,它们的设置是相同的。

我需要做什么才能让音频分发接受我的自定义查询参数? 谢谢 /o

已签名 URL 背后的核心概念之一是它们不易被篡改——您无法更改已签名 URL 并使其保持有效。

CloudFront uses the public key to validate the signature and confirm that the URL hasn't been tampered with. If the signature is invalid, the request is rejected.

...

Signed CloudFront URLs cannot contain extra query string arguments. If you add a query string to a signed URL after you create it, the URL returns an HTTP 403 status.

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html

要将查询字符串参数添加到 CloudFront 签名 URL,您需要在 之前 添加它 URL... 因为添加将更改签名。

Additional/Optional 通过在签名策略中的资源上附加星号 (*) 可以允许签名的云端 URL 参数。

例如,如果您签署 URL: https://example.com/images/funny/cat.png* 那么您将能够向 URL.

添加可选参数

如果参数不应该是可选的,你也可以这样签名:https://example.com/images/funny/cat.png?w=*&h=*。这样 wh 参数的值可以是任何值,但必须设置这两个参数。