引言

接上文,容器内web程序一般会绑定到http://0.0.0.0:{某监听端口}http://+:{某监听端口},以确保使用容器IP可以访问到web应用。

正如我们在ASP.NET Core官方镜像显示的,ASP.NET Core程序在容器内80端口监听请求

This image sets the ASPNETCORE_URLS environment variable to http://+:80 which means that if you have not explicity set a URL in your application, via app.UseUrl in your Program.cs for example, then your application will be listening on port 80 inside the container.

http://+:80是什么鬼? 请求为什么会被路由到监听http://+:80地址的web服务器?

UrlPrefix

这里涉及一个不为人知的概念:UrlPrefix

UrlPrefix是统一资源定位符Url的前缀部分:scheme://host:port/relativeURI

  • "https://www.adatum.com:80/vroot/"
  • "https://adatum.com:443/secure/database/"
  • "http://+:80/vroot/"

web程序启动后,根据监听地址UrlPrefix中的主机元素,会向系统组件Http Server API注册不同的路由桶,由Http Server API将接收的请求时路由到合适的web程序。

容器内web程序监听http://+:80地址,+ 是强通配符,意味着web程序在容器(轻量级虚拟机)内以任意主机名监听80端口的请求。

监听地址UrlPrefix 中的主机元素有四种形态:

  1. 强通配符 ( + )
    当主机元素是一个加号(+),UrlPrefix匹配所有可能的主机名,这时的UrlPrefix属于强通配符类别。
    强通配符在如下场景下有用:
    当web程序要忽略请求到达的方式或忽略请求host标头中指定的站点时,web服务器监听地址的主机元素可设置为强通配符+
  2. 显式主机名
    当主机元素是完全限定的域名,web服务器的主机元素直接与传入请求的host标头相匹配
    明确的主机名对于多站点很有用,这些Web站点根据请求所指向的站点传递不同的内容。
  3. 绑定IP的弱通配符
    主机元素为IP地址,这种类型的UrlPrefix匹配尚未与以上强通配符或显式主机名匹配的任意IP地址主机名
  4. 弱通配符 ( * )
    当星号*作为主机元素出现时,
    这种类型的UrlPrefix将会匹配尚未与以上强通配符、显式或IP绑定的弱通配符匹配的任意主机名,
    此主机元素可以用作默认的catch-all,也可以用于指定URL名称空间的较大部分,而不必使用许多UrlPrefixes

Http Server API维护了一张路由表,决定哪一个应用程序接收传入请求,这张路由表是从预留数据库中构建的,当新产生一个注册项或预留项,将会被放进与特定主机元素相关的路由桶

路由桶优先级

当多个web程序监听的UrlPrefix有重叠时,Http Server API会根据注册的1-->4路由桶依次匹配,路由桶中UrlPrefix的相对URI部分中最长的匹配(假设URL的主机,端口和方案部分完全匹配)是最佳匹配。
在路由桶中找到匹配项后,路由算法将停止搜索并跳过所有优先级较低的存储桶。

例如下面的注册项:

  • 注册项: https://+:80/vroot/ is registered by app1

  • 注册项: https://adatum.com:80/ is registered by app2

  • 注册项: https://*:80/ is registered by app3

对https://adatum.com:80/vroot/subdir/file.htm/的传入请求路由给 app1,
对https://adatum.com:80/default.htm/的传入请求路由给 app2,
对https://otheradatum.com:80/file.htm/的传入请求路由给 app3

总结

  • HTTP Sever API 提供了将请求路由到web程序的机制
  • 应用程序监听地址UrlPrefix的主机元素决定了路由策略,其中+强通配符 表示 忽略请求主机名和请求的方式,可以认为是囫囵吞枣的接收满足(scheme、port、relativeUrl)的请求。
  • https://docs.microsoft.com/zh-cn/windows/win32/http/urlprefix-strings?redirectedfrom=MSDN
  • https://docs.microsoft.com/en-us/windows/win32/http/routing-incoming-requests
  • https://stackoverflow.com/questions/7007929/what-does-a-plus-sign-mean-in-a-http-url-http-80

这应该是一篇偏冷门的知识点,但是结合我们的实际和理论,相信能给读者的知识结构添砖加瓦。

最新文章

  1. iOS开发之Masonry框架源码深度解析
  2. 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构
  3. springmvc学习第三天
  4. libevent (三) 事件注册与循环监听
  5. js:语言精髓笔记2--表达式
  6. hbase regionserver IO问题
  7. linux主次设备号介绍
  8. 使用升级版的 Bootstrap typeahead v1.2.2
  9. ubuntu1404_server搭建lamp
  10. Python开发【第一篇】Python基础之反射
  11. ECshop sina
  12. Scope Chain(作用域链)
  13. Serv-U无法连接到服务器127.0.0.1,端口43958 FTP服务器不能启动
  14. 理解 Python 中的线程
  15. tinyxml2库的使用--MFC工程
  16. ecshop广告分析
  17. CSS3中不常用但很有用的属性-1
  18. 数组转换list集合问题
  19. Xcode 错误收集及解决办法
  20. BZOJ 2118 墨墨的等式(最短路)

热门文章

  1. 转:zabbix 2.0.6监控cisco交换机 2950 2960s 3560G
  2. [转]<版本二>写代码的小女孩
  3. 使用Navicat for Oracle工具连接oracle出错:ORA-12737
  4. 监控Linux系统节点和服务CPU内存性能
  5. Matplotlib简单回顾
  6. Python包管理工具setuptools相关
  7. 百度测试架构师眼中的百度QA
  8. 两种HTTP请求方法:GET和POST的区别
  9. 在 LaTeX 中实现缩印效果
  10. 达拉草201771010105《面向对象程序设计(java)》第六周学习总结