如何通过 HTTPS 加载 Web Worker 脚本?
How do I load a Web Worker script over HTTPS?
我正在尝试使用 Web Worker 将一些 CPU 密集计算卸载到单独的线程中。对于一些上下文,我从 getUserMedia
获取音频流并将其保存到一个文件中,以便在完成后上传到我的服务。我能够从用户那里检索流并通过 WebAudio API 和 HTML5 播放器播放它,但现在我需要采取下一步将其保存到文件中。
问题:
我的主要服务是 运行 通过 HTTPS 连接,因为它仅限于登录用户。我有一个 worker 脚本可以执行我需要的操作,我正尝试通过相对路径将脚本加载到我的 worker 中。我收到以下错误
Mixed Content: The page at 'https://someurl.com:1081/some/path' was loaded over HTTPS,
but requested an insecure Worker script
'http://someurl.com/some/path/lib/assets/javascripts/worker.js'.
This request has been blocked; the content must be served over HTTPS.
我认为这是因为我在我的代码中使用了相对路径,如下所示:
worker = new Worker('lib/assets/javascripts/worker.js');
我想排除这种情况,所以我做了以下更改:
worker = new Worker('https://someurl.com:1081/some/path/lib/assets/javascripts/worker.js');
这并没有解决我的错误。似乎 Worker
正在通过 HTTP 加载我的脚本,无论我尝试使用哪个 url 位置。我找不到任何关于如何通过 HTTPS 使用 Web Worker 的参考资料,所以我希望有人能提供一些见解。
可能的解决方案
我想让你知道有一个可能的解决方案,但对我来说似乎有点 hacky。我可以将我的工作脚本加载为 Blob
并将其直接传递到 Worker
。如果这是唯一的解决方案,我可以让它发挥作用。但我希望找到一种通过 HTTPS 加载脚本的方法。
你试过了吗
//someurl.com:1081/some/path/lib/assets/javascripts/worker.js
而不是
https://someurl.com:1081/some/path/lib/assets/javascripts/worker.js
只是我在这里找到的东西,
我解决了这个问题。错误本身具有误导性,导致我陷入困境寻找解决方案。
这里的问题实际上源于我配置此服务的方式。启动 web worker 的服务实际上是在另一个服务后面代理的,所有请求都通过父服务。这适用于大多数请求,但在这种情况下会导致错误。 Web worker 没有将此端口上的请求转发到我的应用程序,而是试图从父服务本身下载 worker 脚本。这意味着错误源于脚本未找到,而不是协议不正确。
为了解决这个问题,我必须使用其资产管道从 Rails 传入一个本地化的脚本位置。这让工作人员可以抓取脚本并实际工作。
我正在尝试使用 Web Worker 将一些 CPU 密集计算卸载到单独的线程中。对于一些上下文,我从 getUserMedia
获取音频流并将其保存到一个文件中,以便在完成后上传到我的服务。我能够从用户那里检索流并通过 WebAudio API 和 HTML5 播放器播放它,但现在我需要采取下一步将其保存到文件中。
问题:
我的主要服务是 运行 通过 HTTPS 连接,因为它仅限于登录用户。我有一个 worker 脚本可以执行我需要的操作,我正尝试通过相对路径将脚本加载到我的 worker 中。我收到以下错误
Mixed Content: The page at 'https://someurl.com:1081/some/path' was loaded over HTTPS,
but requested an insecure Worker script
'http://someurl.com/some/path/lib/assets/javascripts/worker.js'.
This request has been blocked; the content must be served over HTTPS.
我认为这是因为我在我的代码中使用了相对路径,如下所示:
worker = new Worker('lib/assets/javascripts/worker.js');
我想排除这种情况,所以我做了以下更改:
worker = new Worker('https://someurl.com:1081/some/path/lib/assets/javascripts/worker.js');
这并没有解决我的错误。似乎 Worker
正在通过 HTTP 加载我的脚本,无论我尝试使用哪个 url 位置。我找不到任何关于如何通过 HTTPS 使用 Web Worker 的参考资料,所以我希望有人能提供一些见解。
可能的解决方案
我想让你知道有一个可能的解决方案,但对我来说似乎有点 hacky。我可以将我的工作脚本加载为 Blob
并将其直接传递到 Worker
。如果这是唯一的解决方案,我可以让它发挥作用。但我希望找到一种通过 HTTPS 加载脚本的方法。
你试过了吗
//someurl.com:1081/some/path/lib/assets/javascripts/worker.js
而不是
https://someurl.com:1081/some/path/lib/assets/javascripts/worker.js
只是我在这里找到的东西,
我解决了这个问题。错误本身具有误导性,导致我陷入困境寻找解决方案。
这里的问题实际上源于我配置此服务的方式。启动 web worker 的服务实际上是在另一个服务后面代理的,所有请求都通过父服务。这适用于大多数请求,但在这种情况下会导致错误。 Web worker 没有将此端口上的请求转发到我的应用程序,而是试图从父服务本身下载 worker 脚本。这意味着错误源于脚本未找到,而不是协议不正确。
为了解决这个问题,我必须使用其资产管道从 Rails 传入一个本地化的脚本位置。这让工作人员可以抓取脚本并实际工作。