2016-07-22 92 views
1

我无法从我的javascript文件使用XMLHttpRequest()访问跨域资源。 我知道有几个类似的问题,我经历了其中的一些问题,但对于某些细节我有点困惑。 我会提到我的确切设置和我的具体疑惑。如何/在哪里启用CORS(跨源资源共享)?

设置:

我有我的HTML和JS文件出现在我的本地局域网网络中的Ubuntu的机器上运行的Apache服务器上。该应用程序基本上是hs插件video.js。 从我的Windows PC在同一本地局域网中,我打开hls播放器的index.html文件。只要我选择的视频内容这是目前在Linux机器上,如预期正常工作,但给它一个外部内容(例如http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8),它失败并给出错误:

的XMLHttpRequest无法加载http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8。请求的资源上没有“Access-Control-Allow-Origin”标题。因此'Origin'http://172.20.33.49'不允许访问。

(这里172.20.33.49是Linux机器的IP)

所以我的疑问是:

  1. 在哪台服务器应该在访问控制允许来源头是设置为适当的值(为简单起见,可以说'*')以使其工作:在我的本地linux服务器或托管外部内容的服务器上,还是两者兼有?

  2. 是否有任何设置/配置/代码的变化,我需要在我的浏览器/ JavaScript或HTML代码做这个工作?

  3. 作为一般查询,客户端是否可以/应该为CORS工作或者纯粹是服务器需求/配置?
  4. '访问控制 - 允许来源'在HTTP响应中是强制性的吗?如果不是,那么它的缺席意味着什么 - 这是否意味着只有来自同一个域的资源可以访问,或者是否意味着所有的域都可访问(相当于*)?有任何客户端可以强制服务器添加此标头的方式吗?

回答

2

On which server should the Access-Control-Allow-Origin header be set

托管要与XHR阅读内容的服务器。该错误消息确实说明了这一点,它会告诉您正在请求的资源的URL,然后表示该资源上不存在标题。

Is there any setting/configuration/code change which I need to do in my browser/javascript or HTML code for this to work?

否浏览器透明地处理CORS。

As a general query, is there anything the client can/should do for CORS to work or is it purely a server requirement/configuration?

客户端必须支持CORS。所有现代浏览器都可以。

Is the 'Access-Control-Allow-Origin' mandatory in HTTP responses?

没有

If not then what does its absence mean - Does it mean only resources from same domain can be accessed or does it mean all domains are accessible(equivalent to *) ?

如果服务器没有指定访问控制允许来源则它不准许任何其他来源读取其数据。否(尽管浏览器扩展可拦截响应并添加标头,这对于测试目的可能很有用)。

+0

感谢您的详细回复。 因此,如果我理解正确,在这种特定情况下,我无法播放外部内容(除了安装拦截和修改响应的浏览器插件外),因为我无法控制外部服务器? 稍有不同的是,这是大多数服务器不允许从其他域访问的常见/典型行为。我的意思是这似乎严重限制访问任何JavaScript代码? –

+0

是的,这是正常的。严格限制访问JavaScript是一件好事。您不希望您访问过的任何网站能够向您发送Gmail请求并阅读您的电子邮件?或者你的网上银行?跨原产地请求要求数据供应商主动表示它是安全和可取的。 – Quentin