fetch发送跨域post请求时能否取消发送的options请求

原来项目一直用的axios,可用通过Qs.stringify序列化一次将请求格式转化为formData,这样就能不发送options

新项目改用了fetch,发送的options被阻止不允许跨域,使用QS序列化依旧还是发送了options

clipboard.png
我的意思是让后端接收到的options直接默认通过然后就能继续发送post
后端的意思是请求在nginx就被拦截了还没有到后端代码,nginx设置允许options也不行,让我把options预请求取消了

请问fetch能否处理这种情况呢

阅读 6.3k
4 个回答

options请求来自于同源策略,感觉你跟你们后端都没有理解同源策略以及CORS。

options请求是跨域发起post请求的时候自动发出用来确定是否有跨域请求权限的预请求。

一般的操作是NGINX拦截这个请求,并且添加Access-Control-Allow-Origin等响应头后直接返回200,用于告知客户端其是否有请求权限的。

然后:

  • 这个问题跟qs序列化没有任何关系,这个只是格式化请求数据的,CORS的根本问题在于请求的域与服务端所允许访问的域。
  • options请求发出,要么是会被NGINX这样的web容器拦截,要么就会到后端,只要有一方给他添加对应响应头,并且允许的内容与你的客户端匹配即可通过。
后端的意思是请求在nginx就被拦截了还没有到后端代码,nginx设置允许options也不行

这蛋扯得毫无逻辑。

  1. 假如要在nginx上处理options请求,则不需要转发到后端,直接在nginx返回允许跨域就行了。
  2. 假如不在nginx上处理options请求,则请求会直接转发到后端,何来的收不到一说。

option 请求源于同源策略。剩下应该明白了把

换句话说 options 请求是浏览器行为,不属于开发可控行为,你没有办法去控制,你发送的数据格式与是否发送 options 请求无关,有时候你会看到部分请求没有发送 options 请求是因为之前发送过都已经被浏览器记录起来了,不需要重复请求。
除非你不跨域。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题