问题由来
get请求变成了options,post和delete请求也变成了opeions;原来这就是跨域的非简单请求:
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。
非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。
只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。
参看:http://www.ruanyifeng.com/blog/2016/04/cors.html
所以,跨域问题的解决主要在服务器端,
服务端
最简单有效的配置是:
$response->header('Access-Control-Allow-Origin', '*');
$response->header('Access-Control-Allow-Methods', 'GET,POST,DELETE,PATCH,PUT,OPTIONS');//'*'
$response->header('Access-Control-Allow-Headers', 'token');//头部运行自定义的字段
$response->header('Access-Control-Max-Age', 7200);//2小时,减少预检
客户端:jQuery-Demo
新建一个ajax.html,放到本地(最好是服务器某个目录下),代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jQuery-Ajax-CORS-Demo</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<!--Microsoft CDN-->
<!--http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.js-->
<script>
//http://api.jquery.com/jQuery.ajax/
var url = "http://mini.lixiang80.com/v1/", token = "gwLTE1MDM2MzcwNTItMGM3ZWY2ZGFkMmMzNGYxNDk1ZmUwOTc1MGQ1MTM1YTc=bGl4aWFuZz";
//list
jQuery.ajax({
method: "GET",
url: url + "productAttrs/0",
headers: {token: token}
}).done(function (result) {
console.log(result);
});
//store
$.ajax({
method: "POST",
url: url + "productAttrs",
data: {name: "产品属性", description: "描述"},
headers: {token: token}
}).done(function (result) {
console.log(result);
});
//delete
$.ajax({
method: "DELETE",
url: url + "productAttrs/465bc3a71db94a5cbb5f0726d63c4896",
headers: {token: token}
}).done(function (result) {
console.log(result);
});
</script>
</body>
</html>
如果还不明白,请看看权威的英文文档:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
网友评论