HTTP / 2和CNAME如何协同工作?

时间:2015-12-07 18:28:28

标签: apache nginx dns cname http2

我不知道如何问它,所以我会尝试用一个例子来解释。

我在example.com上启用了这些资源,HTTP/2启用了服务器:

//example.com/css/file.css
//example.com/js/file.js
//example.com/images/file.png

我想要的是通过指向域cdn.example2.com的别名域example.com加载其中一个文件。因此,HTML中的实际资源应如下所示:

//example.com/css/file.css
//cdn.example2.com/js/file.js   -> points to //example.com/js/file.js
//example.com/images/file.png

我的问题是:第二个示例中的所有资源都应由浏览器通过单个连接加载,因为当没有别名域时它们会被加载吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

如果别名解析为不同的IP,则无法通过同一连接加载资源(称为"连接重用" HTTP / 2,如果我没有弄错的话)。这是CDN的问题。

但是为了让您高枕无忧并且完全为CDN欢欣鼓舞,连接重用是一件棘手的事情,即使你所有的域都解析为同一个IP,你也可能没有它,就像你问题中的情况一样。

为了将来证明,您可能希望确保您的网站具有证书扩展名configured correctly以启用连接重用。

在当前版本的Firefox和Chrome中,我还没有观察到连接的重复使用,即使在制作完全谨慎的证书之后,当然也确保这两个域指向相同的IP。

只是思考的一些食物:TLS requires SNI上的HTTP / 2,只有在打开连接时才会发生。因此,当您第一次连接到一个域(例如example.com)时,服务器将获取SNI数据。但是,如果重新使用相同的连接向cdn.example.com发送请求,服务器将无法获得此类数据。某些服务器或使用场景可能对此不对称性很敏感,这可能与浏览器实现(或不重用)连接重用的方式有关。但这些只是你真正猜测的......

答案 1 :(得分:4)

规范并不要求重用,但它明确包含有关何时可以接受重用的信息 - 例如两个解析为相同IP地址的主机。

https://tools.ietf.org/html/rfc7540#section-9.1.1

  

直接或直接与原始服务器建立的连接   通过使用CONNECT方法创建的隧道(第8.3节),5月   被重用于具有多个不同URI权限的请求
  组件。只要原始服务器
,就可以重用连接   是权威的(第10.1节)。对于没有TLS的TCP连接,
  这取决于主机已解析为相同的IP地址。

     

对于" https"资源,连接重用还取决于   拥有对URI中的主机有效的证书。该
  服务器提供的证书必须满足任何检查   客户端在为主机形成新的TLS连接时执行   在URI中。