AWS S3查询字符串参数导致方法不允许错误

时间:2017-11-02 10:56:25

标签: amazon-web-services amazon-s3

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

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

然而,当我添加特定查询字符串参数'select'时,我得到405方法不允许错误。

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

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

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

我无法解释为什么会这样。

1 个答案:

答案 0 :(得分:1)

您需要使用其他参数名称。 select现在对S3有意义,因此不再悄然丢弃。

更新:当AWS开始部署新功能S3 Select时,?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