这似乎很容易,但我不知道我错过了什么。
我有一个公共存储桶,其中包含从我的网站获取的 js 脚本。我注意到我没有发送Origin
标头到 S3,这不是必需的,并且无需任何 CORS 配置即可正常工作。
更重要的是,即使我手动将 Origin 标头添加到该 GET 调用并通过以下方式明确禁止 GET 和我的域:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://www.nonexistingdomain.com</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我仍然可以获得内容。这里发生了什么?
好吧,在与 Quentin 交谈之后,我想我明白了我在哪里误解了 CORS 应该如何工作。
在 Java 世界中,当 Origin 不匹配时实际拒绝请求是一种非常常见的做法。这是另一个线程提及 https://stackoverflow.com/questions/14015118/what-is-the-expected-response-to-an-invalid-cors-request/14064273#14064273。
如果我们以 Spring 为例(这是 Java 世界事实上的标准),添加 CORS 过滤器时会发生以下情况:
String allowOrigin = checkOrigin(config, requestOrigin);
...
if (allowOrigin == null) {
logger.debug("Reject: '" + requestOrigin + "' origin is not allowed");
rejectRequest(response);
return false;
}
where:
/**
* Invoked when one of the CORS checks failed.
*/
protected void rejectRequest(ServerHttpResponse response) {
response.setStatusCode(HttpStatus.FORBIDDEN);
}
你可以找到代码here https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/web/cors/DefaultCorsProcessor.java#L103.
但令我惊讶的是,这对于其他堆栈和服务器端技术来说并不常见。另一种常见的方法是将它们拥有的任何 CORS 配置发送到浏览器,并将决定权留给浏览器。
S3 更加棘手:只有当存储桶 CORS 规则与启用 CORS 的请求(具有 Origin 标头的请求)匹配时,它才会发送 CORS 响应标头。否则,将不会有 CORS 响应标头。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)