首页 > 解决方案 > 是否可以向 CORS 预检请求添加请求标头?

问题描述

XmlHttpRequest我有一个网站,它通过普通的(见下文)从外部服务器(而不是为网站提供服务的服务器)访问 API 。该 API 需要一个用于访问服务的 API 密钥作为请求标头添加。但是,由于这些是CORS 请求,因此浏览器首先会执行预检请求以检查该服务器是否支持 CORS。现在,服务器似乎也希望在浏览器完成的这些预检请求中查看 API 密钥。是否可以将 API 密钥也传递给预检请求?

const req = new XMLHttpRequest();
req.open("GET", "https://some/api/endpoint");
req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
req.setRequestHeader("x-api-key", _apiKey);
req.onload = () => {
  // ...
};
req.send();

标签: javascripthttpbrowsercorsxmlhttprequest

解决方案


CORS 预检OPTIONS请求完全由浏览器控制;所以不可能向它添加请求标头。请参阅https://fetch.spec.whatwg.org/#cors-preflight-fetch。这就是为什么您向其发送请求的任何端点都必须设置为允许未经身份验证的OPTIONS请求,并使用 a 响应它们200 OK(至少只要请求触发预检,如果您添加自定义请求标头,例如标头,它将始终x-api-key如此在问题中)。


推荐阅读