ssl - CloudFlare 工作人员获取 HTTPS 适用于workers.dev 子域,但不适用于自己的子域,出现 525 错误
问题描述
我有一个简单的工作人员,它只是对其他地方的 HTTPS 端点进行获取。
代码实际上只是:
return await fetch('https://something.com/someResource')
当我在本地测试(wrangler dev
)甚至发布到工作人员子域时,这工作正常。当我卷曲时,https://foo.bar.workers.dev/myEndpoint
我得到与https://something.com/someResource
.
但是,我想从我自己的域(通过 cloudflare 管理)运行它,因此工作人员也有一个根据 CloudFlare 文档的路由foo.mydomain.com/*
和AAAA
记录100::
。foo
DNS 工作正常,URL 是可访问的,但是当我尝试访问https://foo.mydomain.com/myEndpoint
CloudFlare 的工作日志时,显示后台获取失败并出现 525 错误(SSL 握手失败)。
我根据一些 CloudFlare 论坛帖子尝试过的事情:
- 添加页面规则
foo.mydomain.com/*
->SSL Mode: full
因为我的整体 SSL 设置设置为flexible
. - 将 fetch 中的主机头设置为源域 (
fetch(url, {headers: {'Host': 'something.com'}})
仅供参考,我不控制原始服务器,因为它是我使用的外部 API。
为什么相同的请求适用于本地*.workers.dev
而不是我自己的域?
解决方案
您的页面规则未生效。页面规则是 for foo.mydomain.com/*
,但它必须匹配子请求 URL,在这种情况下是https://something.com/someResource
,它不匹配。原始工作请求是否匹配并不重要——在这种情况下,重要的是子请求 URL 是否匹配。
不幸的是,您无法创建与您自己的域以外的域匹配的页面规则。
相反,你需要做的是扭转事情。默认情况下将您的 SSL 模式设置为“完整”,然后使用页面规则将其设置为您自己的域的“灵活”。
(注意:“SSL 握手失败”错误本身实际上是 Workers 中的一个已知错误,当您尝试使用 HTTPS 与区域外的主机通信但您设置了“flexbile” SSL 时会发生这种情况。我们在以下情况下不使用灵活 SSL与您自己的域以外的域交谈,但有一个错误会导致请求失败,而不是只使用完整的 SSL。)
推荐阅读
- html - 用jquery下载pdf的问题
- c# - 如何在 Visual Studio 2019 中调试引用 .NET Framework 4.8 类库的 .NET 5 WinForms 应用程序
- javascript - 用于在表单提交上设置 cookie 的 JS 适用于 Firefox,但不适用于 Edge/Chrome
- office365 - 获取当前的“Power Apps per App Plan” - 许可证使用情况
- sql-server - 在 DB2 数据库中转换 CROSS APPLY
- visual-studio-code - 如何在命令提示符下运行 VS Code 程序?
- google-app-engine - 区域 europe-west3 没有足够的资源来满足请求。请稍后再试
- c++ - Tesseract 交叉编译 aarch64 (arm64-v8a) 错误此标头仅适用于 x86
- sql - SQL 数据库关系:在多对多关系中正确实现连接模型?
- typescript - TypeScript 和 Swagger:创建通用的 GetManyAndCount 类定义