现象
- A.js 部署在
http://192.168.2.103:5173/
,服务器部署在http://192.168.2.103:8888/guess.php
- A.js 向 Guess.php 发起 Get 请求时,会报错
1 | Access to fetch at 'http://192.168.2.103:8888/guess.php?reset=1' from origin 'http://192.168.2.103:5173' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. |
解决方法 1:前后端配合
- JS 的 fetch header 的 content-type 设置为 ‘application/x-www-form-urlencoded; charset=UTF-8’ 即可,而不能是其他的
- 后端设置
Access-Control-Allow-Origin
为*
或指定 url
1 | const obj = {a:1}; |
服务端的 NodeJS 代码如下
1 | import cors from 'cors'; |
服务端的 PHP 代码如下
1 |
|
解决方法 2:浏览器插件,仅适用于本地调试
解决方法 3:JSONP,仅适用于 Get 请求,且需要服务端配合
注意 fetch 方法中添加 mode:no-cors
不可行
只是 Get 请求,可以用 JSONP 的方式来解决
客户端的改造
A.js 安装 fetch-jsonp
,代替 fetch
Before
1 | const response = await fetch('http://192.168.2.103:8888/guess.php?reset=1'); |
After
1 | import fetchJSONP from 'fetch-jsonp'; |
服务端的改造
Before
1 | $ret = ['state' => 0]; |
After
1 | $ret = ['state' => 0]; |
解决方法 4:临时关闭浏览器的 CORS 防御策略,仅适用于本地调试
1 | cd /Applications/Google\ Chrome.app/Contents/ |