Azure CDN - 请求主机名与原始主机名不同

Azure CDN - request hostname different to origin hostname

假设我们在使用 Azure CDN 托管证书的 Azure CDN 端点上有一个自定义域名(例如,自定义域是 www-mydomain-com)。

CDN 终结点的源是 Azure 应用服务上的 WordPress 运行 - 源类型 = Web 应用。

Azure 应用服务本机主机名是 mydomain-azurewebsites-net。 应该注意的是,目前 Azure 应用服务也添加了相同的自定义域 (www-mydomain-com),并添加了有效的公共信任证书。

www-mydomain-com 的 DNS CNAME 解析为 Azure CDN 终结点主机名 (mydomain-azureedge-net)。

根据 Azure 门户提供的工具提示,CDN 端点源设置为 Origin host header 空白: “随每个请求发送到源的主机 header 值。如果将此留空,请求主机名将确定此值。Azure CDN 源,例如 Web 应用程序、Blob 存储和云服务,需要此主机 header 值默认匹配原始主机名。"

一切正常。从日志中我们可以确认客户端请求 www-mydomain-com 并且对源的请求也是 www-mydomain-com.

如果我们将 Origin 主机 header 更改为 mydomain-azurewebsitesnet,那么我会看到一些奇怪的行为。

客户端请求 www-mydomain-com - 页面正常加载 - 我可以确认这是缓存未命中。

客户端请求另一个 URL - www-mydomain-com/test - 这又是一次缓存未命中,但是日志显示对源的调用 - 主机名如预期设置为 mydomain-azurewebsites-net 。

奇怪的是,客户端随后被定向到 mydomain-azurewebsites-net/test 而不是 www-mydomain-com/test 。

如果客户端 re-requests www-mydomain-com/test - 页面从缓存中正常加载。

原始客户端请求似乎使用源主机 header 代理到源 - 在缓存未命中时。 我所期待的是,请求仅从 Azure CDN 提供给客户端,并且 CDN 在需要时将内容从源提取到缓存中(使用设置的源主机 headers)。

我想要实现的是不必在应用程序服务上添加公开信任的证书(仅依赖 azurewebsite-net CDN 到原始 TLS 连接的证书)。

我在这里遗漏了什么或者这只是 Azure CDN 的限制(我没有使用 Verizon 或 Akamai Azure CDN)。

我记录了一张 MS 票,在故障排除过程中,我有一个灯泡时刻。使用 mydomain-azurewebsitesnet 主机 header 对 origin 的调用导致后端 WordPress 将具有相关链接的页面加载到主机 mydomain-azurewebsitesnet 的缓存中。这意味着页面中的所有链接——即使是从缓存中提供的,都引用原始主机。一种解决方法是对与主机的硬编码链接 www-mydomain-com - 这并不理想。

不知道为什么我会想到它,但进一步的测试显示 Azure CDN 使用 HTTPS 调用源 - 要求源证书在证书上有主机 header 但 - 证书不必在其有效日期内。 IE。您可以使用具有正确主机名的过期证书。

这让我实现了最初的目标。

Azure CDN - 将原始主机 header 留空 - 这意味着客户端主机 header 通过原始请求 - 意味着我的链接都正常工作。源 WebApp 使用已过期的证书,其中列出了正确的主机(与客户端发送的主机相匹配)。从 CDN 到 HTTPS 源的请求仍然有效。

这让我可以使用 Azure CDN 提供和管理的 TLS 证书(由 DigiCert 颁发),而不必担心在 Azure App Service WebApp 上更新和管理证书(过期证书仍然有效)。