【问题标题】:Many Custom Domains for AppEngine InstanceAppEngine 实例的许多自定义域
【发布时间】:2010-01-01 23:37:03
【问题描述】:

对于在 AppEngine 上运行的电子商务服务,我们希望为客户提供在其自定义域上运行商店的选项(例如:www.mystore.com 而不是 www.enstore.com/mystore)。

从用户的角度来看,我希望他们在他们的偏好屏幕中输入他们想要使用的域名,并告诉他们如何配置他们的 dns。

我知道您通常如何将域添加到 AppEngine 实例(通过 Google Apps),但我不确定您是否可以自动执行该操作。即使有可能,它们也会全部(数百个)列在我们的 Google 应用程序页面上。

有人知道这是否可能/是否有好的方法?

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    我认为没有办法将域“以编程方式”添加到 AppEngine 实例。显然,只能使用您描述的 Google Apps 方法添加域。这在这个 SO 帖子中得到了证实:How do i get foo.somedomain.com get handled by myapp.appspot.com/foo on appengine

    唯一想到的选项如下:

    • HTTP 重定向

      许多 DNS 提供商都支持 HTTP 重定向。在这种情况下,您的客户将能够设置mystore.com 和www.mystore.com 以重定向到www.enstore.com/mystore。这种方法有一些明显的缺点,可能无法接受。首先,使用 301 和 302 重定向,用户仍将被转发到注册的 AppEngine URL:www.enstore.com/mystore,并且会显示在他们的浏览器中。此外,在 301 和 302 重定向之间进行选择会使 SEO 变得棘手,因为您必须了解搜索引擎如何处理这些重定向。例如,当您使用 301 重定向时,大多数搜索引擎不会使用原始 URL 作为关键字的来源。

      除了 301 和 302 重定向之外,一些 DNS 提供商(如 DNS Made Easy)还提供他们所谓的“屏蔽隐藏 iframe 重定向”。该页面将在隐藏的 iframe 中呈现,因此 URL 在用户的浏览器中不会更改。然而,这使得 SEO 变得更加棘手,并且不允许用户为内部页面添加书签,或者轻松引用它们。

      如您所见,此选项不太理想,但在某些情况下是可以考虑的一种选项。另请注意,目前,使用 301 重定向的 HTTP 重定向是 AppEngine 问题跟踪器上Naked Domain Issue 777 的建议解决方法。

    • 反向代理

      另一种选择是在其他地方设置一个小型服务器,例如小型Amazon EC2 Instance,并设置一个简单的reverse proxy。只需使用 Apache 和 mod_proxy(或其他各种替代方案),您就可以非常轻松地进行设置。这将允许您要求您的客户端设置一个指向此实例的普通 A 记录,而 Apache HTTP 服务器将充当您的 AppEngine 的代理。

      在 mod_proxy 中设置反向代理的基本配置指令是 ProxyPass。您通常会为每个 VirtualHost (对于每个客户端域)设置这样的一行:

      ProxyPass / http://www.enmystore.com/mystore/

      您的后端软件可以轻松处理远程代理的配置。

      这是一种更简洁的解决方案,可为您提供充分的控制权 - 但这些好处显然需要付出一些代价。首先,托管反向代理是有费用的。您还将添加另一个故障点,因此您必须将其添加到您的高可用性计划中。此外,如果您通过 SSL 提供某些页面,它可能会变得相当复杂。

    【讨论】:

    • 很好的答案,谢谢!不幸的是,这正是我所害怕的 :-) 重定向并不是一个很好的选择,因为 SEO 确实很棘手,但人们真的只想在位置字段中看到他们的域。我想我们现在会选择选项#2,但是在 gae 前面放置一个单点故障会失去首先使用它的许多优势。我希望他们在不久的将来会想出更好的东西。
    • @Koen Bol:也不要忘记考虑可扩展性,您必须维护一个带有粘性会话的负载平衡代理服务器设置(用于 SSL)。对于一个简单的商店来说,这听起来不是很有趣。这可能表明 AppEngine 它不是您的用例的正确解决方案。
    【解决方案2】:

    另一种选择是让每个客户注册 google 应用,然后将您的 appengine 应用添加到他们的应用中。这样他们就可以管理网址。他们将需要为此使用 cname,因此 url 将被限制为类似“store.customer.com”之类的内容您将必须支持主机头的多租户,但这并不难做到,因为您已经有办法支持多租户。您可能想自己为前几个客户进行设置,以便记录最简单的设置方法。

    rietveld 代码审查应用程序会执行此操作,因为您可以将其添加到您的 google 应用程序域。详情请参阅http://code.google.com/p/rietveld/wiki/CodeReviewHelp#Using_Code_Reviews_with_Google_Apps。

    首选选项可能是通过 Google 解决方案市场提供您的解决方案:http://www.google.com/enterprise/enterprise_marketplace/about.html

    【讨论】:

      【解决方案3】:

      我们做了类似于 Daniel Vassallo 第二个提案的事情。 我们在 Heroku 云上创建了一个 python 应用程序 (连接自定义域没有限制)。 此应用程序使用 python requests 1.2.0 lib 根据请求域从您的应用程序引擎应用程序中获取正确的页面。 您只需要告诉您的客户就是将您的 Heroku 应用网址作为他们的 CNAME 对于裸域,您始终可以使用 wwwizer

      【讨论】:

      • 你能解释一下吗?本质上,我们谈论的是 rev-proxy。但是你只是用 requests 库来做。您可以提供github示例或详细信息吗?需要为高流量站点执行此操作,并且我不想运行 nginx 代理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多