Tumblr 如何处理自定义域映射?
How does Tumblr approach custom domain mapping?
我到处搜索,但找不到明确的答案,甚至找不到工程博客 post 来描述公司如何将自定义域映射到他们的应用程序。
例如,假设我有一个 URL 为 www.ashley.tumblr.com 的 Tumblr 页面。该站点允许您添加自定义域,以便访问 www.Ashley.com 时将呈现 www.ashley.tumblr.com 并完全支持其他页面和目录。
开发这个的技术名称是什么?
他们正在做的事情没有一个单一的名称 - 他们正在设计他们的 HTTP/web-server 代码来处理来自任意 HTTP 请求的请求 Host:
header 并将它们映射到他们现有的 Tumblr帐户。除了要求自定义 domain-name 的所有者更改其 A
、AAAA
或 CNAME
记录以指向与non-custom 域(为了保证发生这种情况,通常将自定义 domain-name 设为 non-custom 域的 CNAME
,以防 non-custom 域的 IP 地址受制于改变)。
说明时间! - 大多数常规 web-servers(Apache、IIS)都是围绕 "website" 的概念构建的:映射到请求的物理目录对应于 HTTP Host:
header 值(或某些通配符匹配模式)以及协议和端口绑定的预定义列表。例如,您将添加一个名为 "MyWebsite.com"(网站名称)的条目,该条目接受对 mywebsite.com
和 www.mywebsite.com
的请求(因为它们是两个不同的 Host:
header 值),也许还有更多,例如 secure.mywebsite.com
在端口 443 上使用 HTTPS)。
更现代的轻量级网络服务器和 reverse-proxies(如 nginx 和 Node.js' Express)省去了物理目录映射,让应用程序代码完全决定如何在应用程序逻辑中路由请求(这是"router" and/or "demultiplexer" (demux) 在 web-application 术语中的作用)——这是以需要自己处理所有逻辑为代价的(公平地说,这些网络服务器随附必要的工具,可以像旧的常规 web-servers 一样轻松配置它们,只是不是默认设置。
...但是优点是你可以让它完全按照你想要的方式工作。
在伪代码中,他们的程序可能看起来像这样:
void handleRequest(Request request) {
String hostHeader = request.getHeader("Host")
RegexMatch nonCustomDomainMatch = hostHeader.match( "([^\.]+).tumblr.com" )
if nonCustomDomainMatch.success {
String accountName = nonCustomDomainMatch.groups[0]
showAccount( accountName )
}
else {
// Look up the custom domain name in a database or other mutable data store:
String accountName = db.execQuery( "SELECT accountName FROM accounts WHERE accounts.customDomainName = @cdn", new { cdn: hostHeader } )
if accountName == null {
showHttp404Error()
}
else {
showAccount( accountName )
}
}
}
在 现实 中,考虑到它们的大小和比例,它可能是硬件内部的一些自定义逻辑 load-balancers 或其他一些轻量级前端服务 - 并且始终具有积极的缓存(数据库查找很昂贵!)。
我到处搜索,但找不到明确的答案,甚至找不到工程博客 post 来描述公司如何将自定义域映射到他们的应用程序。
例如,假设我有一个 URL 为 www.ashley.tumblr.com 的 Tumblr 页面。该站点允许您添加自定义域,以便访问 www.Ashley.com 时将呈现 www.ashley.tumblr.com 并完全支持其他页面和目录。
开发这个的技术名称是什么?
他们正在做的事情没有一个单一的名称 - 他们正在设计他们的 HTTP/web-server 代码来处理来自任意 HTTP 请求的请求 Host:
header 并将它们映射到他们现有的 Tumblr帐户。除了要求自定义 domain-name 的所有者更改其 A
、AAAA
或 CNAME
记录以指向与non-custom 域(为了保证发生这种情况,通常将自定义 domain-name 设为 non-custom 域的 CNAME
,以防 non-custom 域的 IP 地址受制于改变)。
说明时间! - 大多数常规 web-servers(Apache、IIS)都是围绕 "website" 的概念构建的:映射到请求的物理目录对应于 HTTP Host:
header 值(或某些通配符匹配模式)以及协议和端口绑定的预定义列表。例如,您将添加一个名为 "MyWebsite.com"(网站名称)的条目,该条目接受对 mywebsite.com
和 www.mywebsite.com
的请求(因为它们是两个不同的 Host:
header 值),也许还有更多,例如 secure.mywebsite.com
在端口 443 上使用 HTTPS)。
更现代的轻量级网络服务器和 reverse-proxies(如 nginx 和 Node.js' Express)省去了物理目录映射,让应用程序代码完全决定如何在应用程序逻辑中路由请求(这是"router" and/or "demultiplexer" (demux) 在 web-application 术语中的作用)——这是以需要自己处理所有逻辑为代价的(公平地说,这些网络服务器随附必要的工具,可以像旧的常规 web-servers 一样轻松配置它们,只是不是默认设置。
...但是优点是你可以让它完全按照你想要的方式工作。
在伪代码中,他们的程序可能看起来像这样:
void handleRequest(Request request) {
String hostHeader = request.getHeader("Host")
RegexMatch nonCustomDomainMatch = hostHeader.match( "([^\.]+).tumblr.com" )
if nonCustomDomainMatch.success {
String accountName = nonCustomDomainMatch.groups[0]
showAccount( accountName )
}
else {
// Look up the custom domain name in a database or other mutable data store:
String accountName = db.execQuery( "SELECT accountName FROM accounts WHERE accounts.customDomainName = @cdn", new { cdn: hostHeader } )
if accountName == null {
showHttp404Error()
}
else {
showAccount( accountName )
}
}
}
在 现实 中,考虑到它们的大小和比例,它可能是硬件内部的一些自定义逻辑 load-balancers 或其他一些轻量级前端服务 - 并且始终具有积极的缓存(数据库查找很昂贵!)。