引言

接上文,容器内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

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

你不一定知道的UrlPrefix路由规则的更多相关文章

  1. 我们必须要知道的RESTful服务最佳实践

    看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严格遵守RESTful标 ...

  2. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  3. 每个极客都应该知道的Linux技巧

    每个极客都应该知道的Linux技巧 2014/03/07 | 分类: IT技术 | 0 条评论 | 标签: LINUX 分享到:18 本文由 伯乐在线 - 欣仔 翻译自 TuxRadar Linux. ...

  4. [转载]你需要知道的 16 个 Linux 服务器监控命令

    转载自: 你需要知道的 16 个 Linux 服务器监控命令 如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个 专业的 Linux 系统管理员. 有些 ...

  5. react.js 你应知道的9件事

    React.js 初学者应该知道的 9 件事   本文假定你已经有了一下基本的概念.如果你不熟悉 component.props 或者 state 这些名词,你最好先去阅读下官方起步和手册.下面的代码 ...

  6. C#开发人员应该知道的13件事情

    本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方.使用工具可以帮助你在发布之后,解决掉一些问题. 编码标准 遵照编码标准可以编 ...

  7. 隔壁小孩都要知道的Drupal配置

    i春秋作家:Arizona 原文来自:隔壁小孩都要知道的Drupal配置 隔壁小孩都要知道的Drupal配置 Drupal是一个开源的PHP内容管理系统,具有相当复杂的架构.它还具有强大的安全模型.感 ...

  8. 不得不看,只有专家才知道的17个SQL查询提速秘诀!

    不得不看,只有专家才知道的17个SQL查询提速秘诀! 原创 2018-01-23 布加迪编译 51CTO技术栈 “ 除非你遵循本文介绍的这些技巧,否则很容易编写出减慢查询速度或锁死数据库的数据库代码. ...

  9. 每个IT安全专业人员应该知道的12种根本漏洞

    每个IT安全专业人员应该知道的12种根本漏洞 每年,IT安全专业人员都面临着数千个新的软件漏洞和数百万个不同的恶意软件程序,但只有12种根本漏洞会让这些软件漏洞和恶意软件程序攻击你的设备.了解这些根本 ...

随机推荐

  1. 如何为MyEclipse添加XML文档所使用的DTD

    1.打开MyEclipse,找到菜单栏"Window"---->"Preferences(首选项)": 2.在左侧导航菜单栏找到"MyEclip ...

  2. GYOJ_1812_股票(stock)

    题目描述 2130年,股神巴菲特投胎了!他投胎到你身上! 你作为股神转世,能力比原股神还要强,你可以预测到今后n天的股价.假设刚开始你的手上有1元钱,你想知道n天后你最多可以赚到多少钱.作为股神转世, ...

  3. Python实现链表倒序(带头指针)

    class ListNode(object): def __init__(self, x): self.val = x self.next = None def reverseList(self, h ...

  4. jquery.form.js笔记

    由于项目的原因,需要异步上传文件,网上找了找,很多都是用jquery.form插件的,于是乎找资料,调代码,做点小笔记. 官方资料:http://www.malsup.com/jquery/form/ ...

  5. centos7下安装python3.7.2详细教程

    1)下载安装python3.7.2 1:yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel r ...

  6. 达拉草201771010105《面向对象程序设计(java)》第十三周学习总结

    达拉草201771010105<面向对象程序设计(java)>第十三周学习总结 第一部分:理论知识 事件处理基础: 事件源:能够产生事件的对象都可 以成为事件源,如文本框.按钮等.一个事件 ...

  7. 软件工程实验一 Git代码版本管理

    实验一  GIT 代码版本管理 一.实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2)熟练掌握git的基本指令和分支管理指令: 二.实验内容: 1)安装git: 2)初始配置git ,gi ...

  8. Sentinel基于Apollo的持久化改造

    Sentinel基于Apollo的持久化改造 sentinel默认是将用户在dashboard中编辑过的流控信息保存在内存中,所以在重启后,所有之前配置过的流控规则也就不见了.但是sentinel给用 ...

  9. 基于JS正则实现模板数据动态渲染

    最近业务上需要动态渲染模板数据: 一.业务需求: 1.前端后端定义好模板以及变量名,根据打印机类型转换成对应sdk需要的标签模板,保存数据库 2.订单数据是前端根据支付结果获取的,最终渲染完的数据模板 ...

  10. 提高开发效率之VS Code基础配置篇

    背景 之前一直是只用WebStorm作为IDE来编写代码,但是由于: 手中的这台Mac接了两个显示器以后,使用WebStorm会有卡顿. WebStorm需要付费(虽然可以通过某方法和谐). 所以需要 ...