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 的所有者更改其 AAAAACNAME 记录以指向与non-custom 域(为了保证发生这种情况,通常将自定义 domain-name 设为 non-custom 域的 CNAME,以防 non-custom 域的 IP 地址受制于改变)。

说明时间! - 大多数常规 web-servers(Apache、IIS)都是围绕 "website" 的概念构建的:映射到请求的物理目录对应于 HTTP Host: header 值(或某些通配符匹配模式)以及协议和端口绑定的预定义列表。例如,您将添加一个名为 "MyWebsite.com"(网站名称)的条目,该条目接受对 mywebsite.comwww.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 或其他一些轻量级前端服务 - 并且始终具有积极的缓存(数据库查找很昂贵!)。