- 原文地址:How switching our domain structure unlocked international growth
- 原文做者:Pinterest Engineering
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:Starrier
- 校对者:anxsec,Xekin-FE
Christian Miranda | Growth 部门软件工程师前端
在 Pinterest 上的 2 亿月活跃用户中,其中有超过半数的用户在美国以外的地方使用咱们的 app。为了给全球用户提供更好的服务,咱们将持续改进 Pinterest。咱们已经将流量转移到了国家代码顶级域名 (ccTLDs)。例如如今服务于德国的是 www.pinterest.de 而再也不是 www.pinterest.com. 这里咱们将深刻讨论如何帮助提升增加的细节,并讨论在整个过程当中遇到的一些工程挑战。android
Pinterest 自 2010 年成立以来,该网站的每一页都托管在 www.pinterest.com. 上。上线几年后,为了让咱们的内容能够按国家划分并为 Pinterest 提供本地化和相关体验,咱们引进了 country 子域名 (如 de.pinterest.com)。这改善了搜索引擎的优化 (SEO) 和整体增加,由于国家子域名在全球搜索结果中排名更高,更多的人群发现了使用他们语言的相关内容。ios
下一步是实现 ccTLDs。经过调查,咱们了解到一些作出改变的网站所呈现中立或负面增加的现象,尽管业界对 ccTLDs 见解是它在许多搜索引擎算法中提供了一个更强烈的地理定位信号,用户可能会点击以本地域名结尾的结果(这会积极影响搜索排名以致使更高的的点击率)。咱们想对它们进行测试,观察他们将如何做用于 Pinterest 和咱们多样化的内容目录。git
从表面上看,这个项目看起来很简单--咱们所要作的就是提供咱们想要的新的 ccTLDs 并设置重定向来开始给它们流量。然而很明显,修改咱们网站的顶级域名须要对咱们的基础设施进行重大的改变。github
Pinterest 上的身份验证很是标准。咱们有一个处理用户名/密码注册的内部用户服务,对那些第三方(如 Facebook)认证采用 OAuth 开放标准。咱们会在用户每次访问 www.pinterest.com. 时,取回后端返回的令牌并对其进行身份验证。web
随着 ccTLDs 的引入,咱们须要支持对用户进行身份验证的功能,不管他们访问的是哪一个域名。咱们的解决方案是创建一个域名中心(accounts.pinterest.com)做为全部登陆的惟一验证源。算法
简而言之,Pinterest ccTLDs 与域名中心通讯以肯定身份验证状态,并设置客户端 cookie 来提供镜像。下一节将描述这种通讯,咱们称之为 auth 握手。后端
握手的通常流程是:跨域
1.在注册或登陆期间,将从访问域 (例如,www.pinterest.abc) 调用 API 以肯定身份验证状态。 2.若是用户登陆了 accounts.plnterest.com,他们将自动登陆 www.pinterest.abc.。 3.若是用户没有登陆 accounts.pintertst.com,咱们将生成一个访问令牌,并在这两个域名上的 cookie 中设置它,这引导了域名中心的后续访问,所以能够进行第二步。浏览器
第一步中存在一个问题:同源策略规定“只有当两个网页同源时,一个网页上的脚本才能够访问另外一个网页上的数据。”这是互联网安全的支柱,也是阻止恶意网站上 JavaScript 访问我的或敏感信息的手段。在 auth 握手状况下,因为域名不匹配(例如 pinterest**.com** 和 pinterest**.abc**),Pinterest ccTLDs 没法与 accounts.pinterest.com 通讯。
为了解决这个问题,咱们使用了跨域资源共享(CORS),它为 web 服务器提供跨域访问控制,以支持数据跨域传输安全。这是经过在数据传输中向 HTTP 请求和响应添加 CORS 特定的(响应)头来完成的,并相应地处理它们。
咱们经过使用 auth 握手在 www.pinterest.de 上注册 Pinterest 的简化示例来完成这个过程。首先,客户端指定它要使用用户的凭据向 accounts.pinterest.com 提出跨域请求。此时浏览器会自动向请求中添加一个 Origin header,并指定当前域名。
当请求到达服务器时,咱们建立访问令牌,并在 accounts.pinterest.com 上进行用户身份验证。一旦用户登陆,握手就会在响应中向客户端发回一个自定义令牌。此令牌可交换为 www.pinterest.de 可用于身份验证的访问令牌。
服务器跟踪全部 ccTLDs 用于身份验证的白名单。在返回响应以前,咱们要检查 Origin request 报头值是否已经存在于白名单中。若是是这样,服务器将添加特殊的 CORS 响应报头。这些报头中最重要的是 Access-Control-Allow-Origin,该报头的存在将向客户端发出是否容许跨域传输的询问信息。
当客户端接受到响应时,它会看到 Access-Control-Allow-Origin 的报头值“https://www.pinterest.de”。由于这和客户端同源,因此会继续处理响应。自定义令牌被检索并用于获取访问令牌,容许用户登陆 www.pinterest.de.。
您能够在 Mozilla 官方文档中阅读到更多关于跨域资源共享和这些请求所涉及的全部抱头内容。
一旦咱们创建了新的本地域名,下一步就是帮助它们更容易被发现。引导通讯量的最简单方法之一是实现对新域名的重定向。在适合状况下,咱们使用永久性 (301) 重定向,从旧的现有国家子域名重定向到新的相关 ccTLDs (例如 de.pinterest.com → www.pinterest.de).。使用永久性重定向容许咱们将旧域名上的大部分网页排名和权限转移到新的域名中。
咱们还使用了一些间接方法来提升新的 ccTLDs 流量质量。Hreflangs 是能够包含在网页标记中的属性,用于告诉爬虫关于其不一样语言版本的信息。当搜索引擎看到这个标记时,他们会根据搜索者的区域设置显示与本地相关的页面。咱们还使用名为 sitemaps 的文件来帮助提升搜索引擎爬行站点的效率和速度。Sitemaps 是用来列出您网站的网页并告诉搜索引擎您的内容组织结构的文件。经过将这些文件直接提供给搜索机器人,它们能够更容易地找到新的内容来进行爬取和排序。
到目前为止,咱们已经观察到在咱们推出的国家,流量有了积极的增加,点击率和浏览量也有所增长。在这个过程当中,一个更有趣的发现是咱们能够索引更多的页面,由于不一样的顶级域名为搜索机器人打开了一个单独的“爬行预算”。
展望将来,咱们将继续在 ccTLDs 中为咱们的国际内容投资,并正研究进一步加强 accounts.pinterest.com 做为全部 Pinterest 属性中心的认证中心。
鸣谢: Devin Lundberg, Josh Enders, Sam Meder, Jess Males, Evan Jones, Jeff Avery, Grey Skold, Julie Trier, Vadim Antonov, Kynan Lalone, Evelyn Obamos 和 International 团队
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。