当我通过网站从另一台服务器请求资源时,我遇到了一个问题。
我请求资源(通过“范围请求”请求的PDF文件)。
浏览器(在这种情况下为Chrome)将OPTIONS请求发送到服务器。
服务器从OPTIONS返回200,但是标头之一是-Access-Control-Allow-Credentials: true
由于服务器为*
响应标头公开了通配符Access-Control-Allow-Origin
,因此Chrome(我认为)从服务器抛出以下响应,并给我一个错误,指出服务器无法公开通配符如果请求是withCredentials = 'include'
。
现在,我没有在我可以看到的代码中的任何地方设置withCredentials
标志,并且我似乎无法找出服务器如何知道是否使用凭据发送请求。我的Cookie不会随OPTIONS或以下GET / PARTIAL CONTENT请求一起发送。我可以看到请求中没有其他特殊的标头。
所以
服务器如何知道以及如何在客户端告诉凋零凭证设置为包括?
如果我没有设置凭据,是什么原因导致Chrome认为我使用的模式是withCredentials = 'include'
?
Access-Control-Allow-Credentials: true
标头?答案 0 :(得分:1)
- 服务器如何知道?如何在客户端告知凋谢凭证设置为包括?
接收服务器对客户端withCredentials
设置一无所知。服务器只是在请求中接收某种形式的凭据,或者没有。而且就CORS协议而言,接收服务器不会根据请求是否包含凭据来更改其行为。接收服务器只是发送回Access-Control-Allow-Credentials: true
响应标头,还是没有。
- 如果我没有设置凭据,是什么原因导致Chrome认为我使用的模式是
withCredentials = 'include'
?
答案是,这是主观的-它取决于服务器管理员希望响应的对象。但是最佳实践是,您可能只想将Access-Control-Allow-Credentials: true
发送回您知道并明确希望允许的特定来源。因此,CORS协议有一个限制,即如果请求具有凭据并且响应具有Access-Control-Allow-Origin: *
(通配符)标头值,则不允许您的前端代码访问响应。
- 在选项之后,服务器是否应在所有请求上发回
Access-Control-Allow-Credentials: true
标头?
Chrome只会认为该模式实际上是 withCredentials = 'include'
。因此,您的客户代码的某些部分是实际上是在设置withCredentials = 'include'
—否则,withCredentials = 'include'
并不是在实际上设置了所有,但是您为某些原因就是这样。