【问题标题】:AWS S3 query string parameter causes method not allowed errorAWS S3 查询字符串参数导致方法不允许错误
【发布时间】:2017-11-02 10:56:25
【问题描述】:

对该 URL 的 GET 请求按预期返回文件...

curl -v 'http://xxx.s3.amazonaws.com/lineitems/58ecfff764a6036d96deaa69/bootstrap.min.js'

但是,当我添加特定的查询字符串参数“select”时,我会收到 405 method not allowed 错误。

curl -v 'http://xxx.s3.amazonaws.com/lineitems/58ecfff764a6036d96deaa69/bootstrap.min.js?select='

< HTTP/1.1 405 Method Not Allowed
< x-amz-request-id: 7F3339518976EB66
< x-amz-id-2: 8YmXqeME+Y5bLRdlMhDKQyrznjNJr/gw7ortpLjXqFDlPfYR1Ckqz+2Gr2/35/SWKaNviMLZLEk=
< Allow: POST
< Content-Type: application/xml
< Transfer-Encoding: chunked
< Date: Thu, 02 Nov 2017 10:50:33 GMT
< Server: AmazonS3

其他查询字符串参数名称不会导致此问题。它似乎只影响此文件夹中的文件,并且最近才开始发生(上周)。

我在此文件夹中的文件的属性中看不到任何异常,并且所有内容都通过相同的代码上传到存储桶。

我不知道为什么会发生这种情况。

【问题讨论】:

  • 试试 curl -X POST ""
  • 奇怪的是,尽管在 GET 响应中有 Allow: POST ,但它也返回 405。但是响应中没有 Accept 标头。
  • 这是来自 S3 的错误响应。我找不到“ResourceType”的任何文档 - MethodNotAllowed 不允许针对此资源使用指定的方法。 GETSELECT5154A10A5A493C4C PAXPQ9pJYKoIv/tr1cO932iC83yfjvV2HLPC6VRrd6h0Colf7JAixm43T9MXwaTSRKVgQrNooKs=

标签: amazon-web-services amazon-s3


【解决方案1】:

您需要使用不同的参数名称。 select现在对S3有了意义,不再悄悄丢弃。

更新?select 子资源的突然出现似乎是在 AWS 开始部署新功能 S3 Select 时,它允许实际查询 JSON 和 CSV 对象的子集他们的内容,使用 SQL 表达式。该功能于同月晚些时候宣布。

原始答案如下。


由于难以解释的原因,查询字符串中的select= 导致 S3 将您的请求解释为...不同的东西。具体是什么,不清楚。

<ResourceType>SELECT</ResourceType>

有趣的是,如果您尝试 POST,您会收到一条错误消息,指出 POST 也不允许,但 Allow: POST 不再出现在响应标头中。

存储桶日志将请求操作显示为REST.GET.SELECT,这似乎没有记录,其中正常的GET 请求被记录为REST.GET.OBJECT

所以你触发了一些意想不到的行为,你需要使用不同的东西。

它以前有效的事实倾向于排除我最初的理论,即您以某种方式促使 S3 假设您想要发出一个已弃用的 SOAP 请求(这需要 POST),但如果这确实有效一直以来,我倾向于认为您可能无意中偶然发现了尚未发布的功能。

非正式地,S3 会默默地忽略大多数意外的查询字符串参数。 Signature V2 也完全忽略了它们(如果我正确地记得我对该算法的测试结果,实际上要求它们被签名)。

如果您绝对不希望服务解释它,您似乎应该使用以x- 开头的查询字符串参数。这也会将参数写入日志,这可能会在未来被证明是一个有用的副作用,用于调试目的。

您可以通过将自定义查询字符串参数添加到请求的 URL 来包含要存储在请求的访问日志记录中的自定义信息。 Amazon S3 将忽略以 x- 开头的查询字符串参数,但会将这些参数包含在请求的访问日志记录中,作为日志记录的 Request-URI 字段的一部分。 (强调)

http://docs.aws.amazon.com/AmazonS3/latest/dev/LogFormat.html

【讨论】:

  • 很奇怪。我不热衷于无证、不可知的功能。不幸的是,不可能使用不同的东西。它是用户定义的,并且已经流行了一段时间。幸运的是,它位于 CDN 后面,因此可以直接将 CDN 指向可以剥离查询字符串并重定向到 S3 的内容。
  • @JohnnyD 看看 S3 的静态网站托管功能。在存储桶上启用此功能会创建第二个主机名(网站端点),其行为与 REST 端点的行为不同,并且此端点似乎没有注意到查询字符串中的 ?select=。在现有存储桶上启用该功能不会破坏任何东西。您应该能够将您的 CDN 指向该备用端点。出于某种原因,我之前没想过要检查一下。
  • 谢谢,我试试看。
  • @JohnnyD 当时我不想深入推测,但我强烈怀疑SELECT 操作是一项新的 S3 功能,将在 AWS re:Invent 上推出。那是今天发生的。现在可以使用 SQL 表达式扫描具有 CSV 或 JSON 内容的 S3 中的对象,并仅提取特定内容......而无需下载完整的对象。 aws.amazon.com/blogs/aws/s3-glacier-select
  • 这在未来的应用中可能非常有用。最后使用静态网站导致了其他问题,所以我编写了一个简单的代理来剥离查询字符串。它位于 S3 和 CDN 之间,因此负载不重。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
相关资源
最近更新 更多