如果你通过 ionic serve 或者 ionic run 命令使用或 live reload 或者访问过外部 API 结点,那么你肯定遇到过 CORS 问题,譬如下面这样:
XMLHttpRequest cannot load http://api.ionic.com/endpoint.
No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://localhost:8100' is therefore not allowed access.
那么问题来了,什么是 CORS 呢?又是什么导致了这个问题嘞?
什么是 CORS?
CORS=Cross origin resource sharing(跨域资源共享)
origin 就是你现在正在看的主站,你现在访问的是
http://ionicframework.com/blog/handling-cors-issues-in-ionic
,那么 origin 就是ionicframework.com
。
如果说我们向 http://cors.api.com/api
发起一个 AJAX 请求,那么 host origin 会由被浏览器自动列入CORS请求的 Orgin header 指定好了,由于ionicframework.com
和 api.com
的主机并不匹配,所以在一个HTTP OPTIONS请求报头的 form 中我们所有从 ionicframework.com
发起的访问服务器资源的请求必修得到服务器的授权。
假如上面的请求出现错误(不被服务器允许),那么我们是无法从服务器访问到(api.com上的)资源的。
让我们来看一下当你通过ionic serve, ionic run,ionic run -l来运行app的时候 origin 会是什么。
浏览器中的运行
当你运行 ionic serve 时发生了什么呢?
- 启动了一个本地 web 服务器
- 你的浏览器打开并定位到本地服务器地址
这让你看着你的应用加载到你电脑上一个浏览器里,地址是:http://localhost:8100
(如果你选择了 localhost的话)。
你的 origin 就是localhost:8100
。
任何的发送到其他不是 localhost:8100
主机上的 AJAX 请求都会把localhost:8100
作为他的 origin,这就会导致必须要经过一个 CORS 预检来