为什么设置了Access-Control-Allow-Methods后OPTIONS请求还是被拦截?
我在前端用fetch发POST请求时,明明在服务器设置了”Access-Control-Allow-Methods: POST”,但浏览器还是报错说方法不允许。预检OPTIONS请求返回405状态码,控制台提示:
fetch('https://api.example.com/data', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'test' })
})
.then(response => console.log(response))
.catch(err => console.error('请求失败:', err));
我检查过服务器响应头确实有Access-Control-Allow-Methods字段,但为什么还是被拦截?难道这个头需要配合其他配置?
以Node.js为例,关键代码如下:
检查你的服务器是否正确响应了OPTIONS请求,尤其是状态码和CORS头。「就这样」
Access-Control-Allow-Methods是不够的,还需要正确处理OPTIONS请求本身。问题出在服务器端对OPTIONS请求的响应上。当浏览器发送OPTIONS请求时,服务器直接返回了405状态码(Method Not Allowed),说明服务器没有正确配置来处理这个预检请求。
解决方法很简单,在服务器端做以下调整:
1. 确保服务器能够正确响应OPTIONS请求,并返回200状态码
2. 在响应头中加入
Access-Control-Allow-Methods: POST, OPTIONS(注意包含OPTIONS)3. 同时添加
Access-Control-Allow-Headers: Content-Type,因为你的请求带了自定义头举个栗子,如果你用的是Node.js + Express,可以这么写:
最后提醒一下,浏览器兼容性在这里一般不会出问题,主要是服务器端要正确处理预检请求。不然即使前端代码没问题,也会被拦截。