AWS是否允许带有请求体的Get请求?从CloudFront返回403错误。

7

我使用Visual Studio并使用AWS无服务器应用程序项目模板将api发布到了AWS上,目前我正在使用postman测试方法,但是需要body的所有get方法都返回一个错误,响应中提到了cloudfront,我不知道问题是否与cloudfront有关,还是AWS HTTP 1.1规范实现不允许带有body的get请求:

注意:客户端要求get请求带有body

RFC 7231 HTTP/1.1规范如下: GET请求消息中的有效负载没有定义的语义; 在GET请求上发送负载体可能会导致一些现有的实现拒绝请求。

    <HEAD>
        <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
        <TITLE>ERROR: The request could not be satisfied</TITLE>
    </HEAD>
    <BODY>
        <H1>403 ERROR</H1>
        <H2>The request could not be satisfied.</H2>
        <HR noshade size="1px">
Bad request.


        <BR clear="all">
        <HR noshade size="1px">
        <PRE>
Generated by cloudfront (CloudFront)
Request ID:
</PRE>
        <ADDRESS></ADDRESS>
    </BODY>
</HTML>

我的问题是:
  1. AWS允许带有正文的GET请求吗?
  2. AWS如何处理带有正文的GET请求?
  3. 有没有办法在AWS上使GET请求带有正文?
我在这里看到了几乎相同的问题:AWS GET request with body rejected by CloudFront,他们指向这个文档:https://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-lambda-non-proxy-integration.html,该文档说明如果您发送带有正文的GET请求,它会返回400错误,但我收到的错误是403错误。
所以你能否进一步澄清一下?或者你能指出Amazon文件中有关GET请求限制的内容吗?
非常感谢。
1个回答

21
在CloudFront中,不允许使用带有正文的GET请求。如果您发送了主体,您将收到403的响应码。尽管RFC没有明确规定您应该拒绝带有主体的GET请求,但CloudFront不支持该操作。在GET请求中传递正文的最佳选项是通过查询字符串(包括头和查询字符串的请求最大长度为20,480字节)。如果观看者的GET请求包含正文,则CloudFront会向其返回HTTP状态码403(禁止)。
参考链接:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html

你是我的救命恩人,用户11097368,非常感谢您提供的答案。我一直在尝试使用带有--data-raw''的GET cURL请求,但一周时间里我一直收到来自AWS CloudFront的403错误,而这个答案解决了我的问题。 - Bhala T R
啊哈,哈哈,谢谢。我在Postman的Body选项卡中定义了一些字段。 - zarathoustra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接