CORS 标头无法与 Icecast 配合使用,尽管发送了必要的标头

问题描述 投票:0回答:1

这个问题可能与 Icecast 特别相关,但我认为这更与我不明白如何解决这个问题有关。

我正在运行 Icecast 服务器,并且我想通过不在同一主机上的 Javascript 客户端连接到它。

这不起作用。我每次都会在客户端收到以下内容。

跨源请求被阻止:同源策略不允许读取http://example.com:8000/live处的远程资源。 (原因:CORS请求未成功)。状态码:(空)。

在 Icecast 配置中,我有这个。

<http-headers>
    <header name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
    <header name="Access-Control-Allow-Origin" value="*" />
    <header name="Access-Control-Allow-Methods" value="GET POST PUT DELETE" />
</http-headers>

如果我用curl击中icecast,这里是返回的标题。

< Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET POST PUT DELETE

如果我去掉Access-Control-Allow-Headers和Access-Control-Allow-Methods,它仍然不起作用。

我觉得它应该只与 Access-Control-Allow-Orgin: * 一起使用。

我已经阅读了 Stackoverflow 上的其他答案,并阅读了大量有关 CORS 的文章,但我不知道我错过了什么。

查看 Devtools 网络是否出现 CORS 故障。我明白了。 OPTIONS /live undefined 似乎是一个问题。

OPTIONS /live undefined
Host: radio.example.com:8000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: GET
Access-Control-Request-Headers: icy-metadata
Referer: http://radio.example.com/
Origin: http://radio.example.com
DNT: 1
Connection: keep-alive
Sec-GPC: 1

如果我通过wget或curl或不关心CORS的东西访问,Icecast服务器工作得很好。浏览器似乎正在期待一些我目前没有提供的东西来满足它的 CORS 需求。

javascript cors icecast
1个回答
0
投票

我明白了问题所在。正是詹姆斯的评论让我走上了正确的道路。我正在运行的 Icecast 版本(2.4.5 - 当前稳定版本)无法正确支持 CORS。

我正在触发对 Icecast 的 OPTIONS 调用,但此版本的 Icecast 不支持 OPTIONS。根据更新日志,测试版 2.5 确实支持此功能。

来自 Icecast 的协议更新包括:

  • 完整的选项、发布和删除支持
  • 改进了 CORS 支持

所以现在,除非我想在生产中运行测试版,否则我必须在我正在构建的使用 Icecast 的客户端应用程序中没有那么多奇特的功能的情况下才能正常工作。

感谢您的评论,他们帮助我弄清楚了这一点。这让我很烦恼,因为我感觉我做的一切都是正确的。通过开发工具中的“网络”选项卡进行诊断至关重要,这会导致选项问题。

https://icecast.org/news/icecast-release-2_5-beta3/

© www.soinside.com 2019 - 2024. All rights reserved.