为何无需OPTIONS预请求,AWS S3仍返回CORS响应头?
我原本以为在CORS机制中,必须发送OPTIONS预请求才能获取Access-Control-Allow-Methods、Access-Control-Allow-Origin这类响应头,示例请求如下:
curl -i https://example.com/object.txt.txt -H "Origin: http://localhost/" -H 'Access-Control-Request-Method: GET' -X OPTIONS
对应的响应会包含:
.... ... Access-Control-Allow-Origin: * Access-Control-Allow-Methods: PUT, GET, DELETE .... ....
但实际访问AWS S3对象时,我未添加-H 'Access-Control-Request-Method: GET'和-X OPTIONS参数,仅发送请求:
curl -i https://example.com/object.txt -H "Origin: http://localhost/"
却仍收到包含以下内容的响应:
.... .... Access-Control-Allow-Origin: * Access-Control-Allow-Methods: PUT, GET, DELETE .... ....
我想了解是AWS内部自动发送了OPTIONS预请求,还是我的CORS认知存在错误?
注:我刚接触AWS/CORS,任何建议都将十分感谢。
我的存储桶CORS配置如下:
[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "PUT", "GET", "DELETE" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [] } ]
你的CORS认知没问题,只是AWS S3的CORS处理有自己的特殊逻辑:
预请求不是必须的:只有当浏览器发起非简单请求时才会触发OPTIONS预请求。简单请求包括GET、HEAD、POST这类基础方法,且请求头没有自定义的特殊字段(比如除了Accept、Content-Type等标准简单头之外的)。你用curl发的GET请求就是标准的简单请求,浏览器本来就不会先发OPTIONS,直接发实际请求就行。
S3主动返回CORS头:AWS S3的设计是,只要请求带了Origin头且符合存储桶的CORS配置,它就会在实际请求(比如你的GET)的响应里直接返回
Access-Control-Allow-Origin、Access-Control-Allow-Methods这些头,而不是只在OPTIONS预请求里返回。这是S3为了简化简单请求的CORS验证做的优化,完全符合CORS规范——规范只要求预请求返回这些头,没说实际请求不能返回。关于
Access-Control-Allow-Methods:这个头主要是给预请求用的,告诉浏览器哪些方法被允许,但S3把它加到实际请求响应里也没问题,不影响浏览器的验证逻辑。
- 你对CORS预请求的理解是正确的,它只针对非简单请求。
- AWS没有自动帮你发OPTIONS请求,是S3本身会在符合条件的实际请求中返回CORS相关头。
- 对于简单请求,浏览器不需要预请求,直接通过实际请求的响应头就能完成CORS验证。
内容的提问来源于stack exchange,提问作者Vaishnavi Vinay

