前提:
当网站(http://example.com)尝试发出跨域请求时,浏览器会向标头Origin: http://example.com
的跨源服务器(http://other-server.com)发送HTTP请求。如果http://other-server.com处的服务器批准http://example.com作为有效来源,那么它将1)无错误地响应并且2)将响应标头设置为Access-control-allow-origin: http://example.com
我的问题是 - 为什么有必要在响应中设置Access-control-allow-origin
标头?没有错误的响应是否已经确认服务器(http://other-server.com)允许跨源请求?
答案 0 :(得分:2)
这一额外的确认层使服务器在支持CORS方面具有很大的灵活性。例如:
1)设置Access-Control-Allow-Origin
标头时,服务器有很多选择。它可以使用*
值来允许所有客户端,也可以使用原始的实际值(例如http://example.com
)来限制客户端的范围。如果服务器确实支持CORS,但不支持所有来源,则它可以正确响应,但Access-Control-Allow-Origin
可以设置为http://notyourorigin.com
。
2)CORS通过Access-Control-Allow-Methods
和Access-Control-Allow-Headers
预检响应标头提供更大的灵活性。这些标题超出了简单的二进制成功/错误HTTP状态,并提供了有关服务器支持和不支持的更多细微信息。
如上面的示例所示,没有任何上下文的错误响应可能会让用户感到非常困惑。如果你发出一个CORS请求,而你所得到的只是一个错误响应,你就不知道为什么那个请求失败了。你做错了吗?服务器是否支持CORS?如果没有任何附带信息,这很难搞清楚。 Access-Control-*
为用户提供了更多上下文,因此他们可以有效地调试他们的CORS请求。