原文:

https://www.lastupdate.net/4669.html

昨天H5组的开发反馈了一个问题,说浏览器收不到跨域的配置,提示:Failed to load https://nnmjstore.xxx.com/records/34e38a6b-0aaf-4bc3-af73-1d9dffcdb6f8_cdhzmj_15: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://cdhzmjstore.xxx.com' is therefore not allowed access.

即:cdhzmjstore.xxx.com使用Ajax(我没具体问,猜可能是上传文件吧)访问nnmjstore.xxx.com上的文件失败了。

而nnmjstore.xxx.com的文件是存放在阿里云oss上面的,我记得已经设置过跨域了,马上去检查一下,发现是没问题的。为了解决问题,干脆把来源都放开了,如下图:

但是比较悲催的是,还是收到同样的提示错误。。。

于是又翻了下阿里云的OSS文档,摘录如下:

同源策略

跨域访问,或者说JavaScript的跨域访问问题,是浏览器出于安全考虑而设置的一个限制,即同源策略。当来自于A网站的页面中的JavaScript代码希望访问B网站的时候,浏览器会拒绝该访问,因为A、B两个网站是属于不同的域。

在实际应用中,经常会有跨域访问的需求,比如用户的网站www.a.com,后端使用了OSS。在网页中提供了使用JavaScript实现的上传功能,但是在该页面中,只能向www.a.com发送请求,向其他网站发送的请求都会被浏览器拒绝。这样就导致用户上传的数据必须从www.a.com中转。如果设置了跨域访问的话,用户就可以直接上传到OSS而无需从www.a.com中转。

跨域资源共享的实现

跨域资源共享(Cross-Origin Resource Sharing),简称CORS,是HTML5提供的标准跨域解决方案,OSS支持CORS标准来实现跨域访问。具体的CORS规则可以参考W3C CORS规范。其实现如下:

  1. CORS通过HTTP请求中附带Origin的Header来表明自己来源域,比如上面那个例子,Origin的Header就是www.a.com。
  2. 服务器端接收到这个请求之后,会根据一定的规则判断是否允许该来源域的请求。如果允许的话,服务器在返回的响应中会附带上Access-Control-Allow-Origin这个Header,内容为www.a.com来表示允许该次跨域访问。如果服务器允许所有的跨域请求,将Access-Control-Allow-Origin的Header设置为*即可,
  3. 浏览器根据是否返回了对应的Header来决定该跨域请求是否成功,如果没有附加对应的Header,浏览器将会拦截该请求。如果是非简单请求,浏览器会先发送一个OPTIONS请求来获取服务器的CORS配置,如果服务器不支持接下来的操作,浏览器也会拦截接下来的请求。

OSS提供了CORS规则的配置从而根据需求允许或者拒绝相应的跨域请求。该规则是配置在Bucket级别的。详情可以参考PutBucketCORS

这里有几个要点:

  • CORS相关的Header附加等都是浏览器自动完成的,用户不需要有任何额外的操作。CORS操作也只在浏览器环境下有意义。
  • CORS请求的通过与否和OSS的身份验证是完全独立的,即OSS的CORS规则仅仅是用来决定是否附加CORS相关的Header的一个规则。是否拦截该请求完全由浏览器决定。
  • 使用跨域请求的时候需要关注浏览器是否开启了Cache功能。当运行在同一个浏览器上分别来源于www.a.com和www.b.com的两个页面都同时请求同一个跨域资源的时候,如果www.a.com的请求先到达服务器,服务器将资源带上Access-Control-Allow-Origin的Header为www.a.com返回给用户。这个时候www.b.com又发起了请求,浏览器会将Cache的上一次请求返回给用户,此时Header的内容和CORS的要求不匹配,就会导致后面的请求失败。

这时候突然想起,为了加速访问,我们在OSS的前端使用了阿里云CDN服务,这样的话,CDN有可能覆盖了OSS的设置,也就是说,跨域设置需要在CDN上做。

一时半伙找不到文档,也不会设置,就发了个工单询问。技术工程师响应的超级快,比以往每一次都快,并且直接告诉了方法,确实和我猜测的一样。

在CDN控制台,找到nnmjstore.xxx.com,点设置-》缓存控制-》设置HTTP,添加一个HTTP头,参数为Access-Control-Allow-Origin,值为*,即可,如下图:

添加生效后,经过测试,问题解决了!

CDN惹的祸:记一次使用OSS设置跨域资源共享(CORS)不生效的问题的更多相关文章

  1. Session丢失,都是CDN惹的祸

    周六下午,正在外面吃饭,运营的同事火急火燎地给我打电话,说是网站出问题了,用户登录不了,而且这种情况也不是全部,只有部分地区有问题.没办法,只能回到家里找问题,打开代码,翻来覆去地找问题,搞了整整一下 ...

  2. 【ipv6惹的祸】curl 超时

    偶然发现 最近在公司日志平台 总是可以看到很多关于php curl的错误信息 Operation timed out after 0 milliseconds with 0 out of 0 byte ...

  3. kindeditor多图片上传找不到action原来是private File upload成员变量惹得祸

    kindeditor多图片上传找不到action原来是private File upload成员变量惹得祸

  4. VPN断线原因解析- ADSL惹的祸

    在我们使用VPN的时候,最讨厌的就是无故的断线了,可能正在和好基友一起副本,或者正在视频热聊中,还或者youtube视频看的正起劲,突然windows一个对话框弹出 - “连接已经断开”.实在是太影响 ...

  5. 【转】VS2013 C#WinForm程序构造界面拖动控件NumericUpDown时"未响应“是有道词典惹的祸

    很久之前遇到过因为金山词霸和其他软件冲突导致的程序无响应的情况. 没想到今天情况重现,VS2013在可视化编辑NumbericUpDown控件的时候,又出现了”未响应“,发现又是有道词典惹的祸. 可见 ...

  6. 都是iconv惹的祸

    今天在做采集的时候发现只取到了网页的部分内容,当时我就郁闷了,之前都用的采集都可以采集到网页的所有内容,但这次死活就取到部分内容.寻找原因才知道原来是iconv惹的祸. 发现问题时,网上搜了搜,才发现 ...

  7. win7打开或关闭windows功能 提示“出现错误,并非所有的功能被更改”,管理员权限惹的祸

    2013-07-25 18:12:06 最近要用到windows的telnet功能,本来是很简单的事情,因为管理员权限的问题,花了不少时间,才发现是管理员权限惹的祸,更滑稽的是,自己一直以来都不是管理 ...

  8. ie8 background css没有显示?——都是空格惹的祸

    ie8 background css没有显示?——都是空格惹的祸

  9. 都是SCI惹的祸?

    都是SCI惹的祸? 过去只知道地质学家需要跋山涉水寻找宝藏,最近同一位海外归来的学者谈起,方知少数其它领域的科研人员,也"跋山涉水",在内地研究机构寻找可以写好文章的研究成果,不管 ...

随机推荐

  1. Java 线程的基本使用

    GitHub Page: http://blog.cloudli.top/posts/Java-线程的基本使用/ 创建线程 创建线程的方式有两种: 继承 Thread 类 实现 Runnable 接口 ...

  2. Ubuntu 16.04 ssh协议连接root管理员用户

    首先先给自己的Ubuntu 创建一个root密码.毕竟登陆的时候都是用户登陆的. 在 命令行中输入  sudo passwd // 设置root密码 password for func : //输入用 ...

  3. NetCore HttpClient The SSL connection could not be established, see inner exception

    之前遇到一个问题 https://www.cnblogs.com/leoxjy/p/10201046.html 在centos 7.x  HttpClient访问会出问题  The SSL conne ...

  4. Java向MySQL新增记录时间误差问题

    参考文档 https://www.jianshu.com/p/115861aad147 https://blog.csdn.net/ai932820942/article/details/845804 ...

  5. 'while' statement cannot complete without throwing an exception

    You are probably using Android Studio or IntelliJ. If so, you can add this above your method contain ...

  6. TransactionScope 使用的注意事项

    前两天为了给代码做一些事务封装,写了个小Demo,用TransactionScope代码块实现. 第一条更新成功后第二条刻意抛出异常,结果发现第一条总执行成功,这不符合预期,于是开始一步步跟踪调试. ...

  7. Layer.js弹层的一些简单的使用

    //-----------这里只是简单的做一下记录,没有封装,作为笔记防止忘记了 //----contentMsg 里面是可以传入 HTML代码的 top.layer.alert(contentMsg ...

  8. Vert.x(vertx) 认证和授权

    每个线上系统几乎都是离不开认证和授权的,Vert.x提供了灵活.简单.便捷的认证和授权的支持.Vert.x抽象出了两个核心的认证和授权的接口,一个是 AuthProvider,另一个是User.通过这 ...

  9. 【夯实基础】-浅谈"单点登录"的几种实现方式

    单点登录 一.Session跨域 所谓Session跨域就是摒弃了系统提供的Session,而使用自定义的类似Session的机制来保存客户端数据的一种解决方案. 如:通过设置cookie的domai ...

  10. ObjC: 委托模式

    转自:http://marshal.easymorse.com/tech/objc-%e5%a7%94%e6%89%98%e6%a8%a1%e5%bc%8f 在ObjC中,经常提到委托模式(deleg ...