前后端分离开发基本都会有跨域问题,一般服务端加个Access-Control-Allow-Origin
就可以了,可是有些情况单纯设置Access-Control-Allow-Origin
并不能解决问题。
这是为什么呢?其实跨域并不只是域名鉴别,它有着一整套的方案,就是 跨域资源共享(CORS)。关于CORS本文不做赘述,文末会给出一些相关参考链接。
Access-Control-Allow-Origin
指的是允许来自指定源的跨域访问,那么是否还有其它影响因素呢?
注:确切来说并不是限制访问,因为在跨域请求中,请求已经发送,服务端也执行了相应的动作。
只是浏览器根据服务端返回的CORS信息来决定是否把数据给请求者。
在restful
接口跨域中我们经常会遇见OPTIONS
的请求,如果跨域配置正确才会发起一次真正的请求,但有些接口却是直接就能发起请求的。
这就是CORS
有着一定的规则:
当请求方法为GET、POST、HEAD
,Header的Content-Type为application/x-www-form-urlencoded、multipart/form-data、text/plain
时,无需先发起OPTIONS
请求。
如果请求不在这些范围怎么办,那么就需要在OPTIONS
的返回header中定于允许的内容
如:
Access-Control-Allow-Methods: PUT,DELETE
用以允许PUT,DELETE
请求。
Access-Control-Request-Headers: AUTH,Content-Type
用以允许请求头中的自定义字段AUTH
及任意的Content-Type
。
其它:
Access-Control-Max-Age: 3600
本次请求验证信息的有效期(单位:秒),有效期内本次允许的请求类型将无需再触发OPTIONS
请求,合理设置可以避免过多的请求压力。
Access-Control-Allow-Credentials: true
允许带Cookie请求,设置此项时Access-Control-Allow-Origin
需为确定的域名。
文中如有理解偏差,欢迎点评指正。
相关资料:
《HTTP访问控制(CORS)》https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
《跨域资源共享 CORS 详解 - 阮一峰》http://www.ruanyifeng.com/blog/2016/04/cors.html