Http Server API路由请求到web程序

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

引言


接上文,容器内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服务器监听地址的主机元素可设置为强通配符+


  1. 显式主机名


当主机元素是完全限定的域名,web服务器的主机元素直接与传入请求的host标头相匹配, 明确的主机名对于多站点很有用,这些Web站点根据请求所指向的站点传递不同的内容。


  1. 绑定IP的弱通配符


主机元素为IP地址,这种类型的UrlPrefix匹配尚未与以上强通配符或显式主机名匹配的任意IP地址主机名


  1. 弱通配符 ( * )


当星号*作为主机元素出现时, 这种类型的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://*: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)的请求。


  • 多个web程序监听的UrlPrefix有重叠时,Http Server API根据host元素形成的路由桶有优先级


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

相关文章
|
15天前
|
开发框架 监控 .NET
Visual Basic的Web服务和REST API开发指南
【4月更文挑战第27天】本文探讨了使用Visual Basic(VB.NET)构建Web服务和RESTful API的方法。首先介绍了Web服务的基础和REST API的概念,然后阐述了.NET Framework与.NET Core/.NET 5+对VB.NET的支持,以及ASP.NET Core在Web开发中的作用。接着,详细讲解了创建RESTful API的步骤,包括控制器与路由设置、模型绑定与验证,以及返回响应。此外,还讨论了安全措施、测试方法、部署选项和监控策略。最后强调,VB.NET开发者可以通过ASP.NET Core涉足现代Web服务开发,拓宽技术领域。
|
12天前
|
弹性计算 JSON Shell
基于Web API的自动化信息收集和整理
【4月更文挑战第30天】
20 0
|
6天前
|
开发框架 JavaScript 安全
WIndows Server 2016 部署 Web服务(简单篇)
WIndows Server 2016 部署 Web服务(简单篇)
|
14天前
|
JSON 安全 API
【专栏】四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥
【4月更文挑战第28天】本文探讨了四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥。基本认证简单但不安全;OAuth适用于授权第三方应用;JWT提供安全的身份验证信息传递;API密钥适合内部使用。选择方法时需平衡安全性、用户体验和开发复杂性。
|
16天前
|
缓存 前端开发 API
toapi,一个强大的 Python Web API库!
toapi,一个强大的 Python Web API库!
27 5
|
18天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
15 3
|
24天前
|
JSON API 数据库
解释如何在 Python 中实现 Web 服务(RESTful API)。
在Python中实现Web服务(RESTful API)涉及选择框架(如Flask、Django、FastAPI),定义路由及处理函数(对应HTTP请求方法),处理请求,构建响应和启动服务器。以下是一个使用Flask的简单示例:定义用户列表,通过`@app.route`装饰器设置GET和POST请求处理函数,返回JSON响应,并用`app.run()`启动服务器。实际API会包含更复杂的逻辑和错误处理。
16 1
|
27天前
ctfhub->web->web前置技能->HTTP协议->请求方式
ctfhub->web->web前置技能->HTTP协议->请求方式
|
1月前
|
API 前端开发 JavaScript
Spartacus 中 saved cart 的 occ API 请求
Spartacus 中 saved cart 的 occ API 请求
17 0
Spartacus 中 saved cart 的 occ API 请求
|
1月前
|
网络协议 安全 Java
理解HTTP协议:Java Web开发的基础
【4月更文挑战第3天】本文介绍了HTTP协议的基础知识,包括其无状态、应用层协议的特性,基于请求/响应的工作模式,以及TCP连接、HTTP请求和响应的流程。HTTP方法如GET、POST、PUT等用于不同操作,状态码则表示请求结果。在Java Web开发中,理解HTTP有助于设计RESTful API、管理状态、确保安全性、优化性能和处理错误。HTTP协议的深入理解对构建高效、健壮和安全的Web应用至关重要。