2

我想构建一个前端(静态)和后端(API)的Web应用程序,除了共享同一个域,完全分开。通常我会认为这没有问题,但我有一些特殊要求:

  • API 在Heroku上运行(使用 Django 和 TastyPie)
  • 所有静态内容,包括 html 文件都将托管在Amazon S3上

前端应用程序将是一个单页 Javascript 应用程序(带有一个基本模板,让我们调用它index.html)并通过 AJAX 从 API 填充内容。由于我还不想为 API 实现 CORS,并且希望遵循同源策略,因此我希望 API 和 S3(存储桶)上的文件以某种方式共享同一个域。我也不想使用 Django 的平面应用程序或index.html通过 Django 渲染。

我扫描了 Google 和 stackoverflow,但到目前为止找不到合适的解决方案。据我阅读天真的方式(以某种方式将域指向 Heroku 应用程序和 S3 存储桶)是不可能的。我想到了一些解决方案,但没有找到以下来源:

  • 如果可能,将域名指向 Heroku 和 S3 存储桶上的 API
  • 将一些选项传递给 Heroku 以呈现托管在 S3(ProcFile?)上的 html,使用 Django 和 S3 库来获取其他静态资产
  • 也许用 boto 做一些事情来实现这一点
  • 其他完全不同的建议?

以前有没有人尝试过这样的事情并且可以指出我正确的方向?

一个补充:稍后我想使用一些lile PhantomJS来使单页应用程序可抓取。理想情况下,爬虫的此输出也应托管在 S3 存储中。

4

1 回答 1

1

这在您当前的堆栈中是不可能的。

您的 Heroku 应用程序和您的 S3 存储桶实际上是通过两个不同的域提供服务的。拥有两个不同域的好处是您可以从所有静态资产请求中卸载您的服务器。

实现您想要的一种复杂方法是​​通过一个唯一域适当地代理请求。幸运的是,Heroku 和 Amazon 都不会让你这样做:

  • Nginx 可以代理一个static文件夹,your-api.herokuapp.com你不能在 Heroku 上配置 nginx,这首先会破坏使用 PaaS 的目的。
  • S3 可以托管您的网站并将api文件夹重定向到,your-api.herokuapp.com但只能使用不能解决 CORS 问题的 301 重定向。如果您好奇,请尝试一下:

    <RoutingRules>
      <RoutingRule>
        <Condition>
          <KeyPrefixEquals>api/</KeyPrefixEquals>
        </Condition>
        <Redirect>
          <HostName>your-api.herokuapp.com</HostName>
        </Redirect>
      </RoutingRule>
    </RoutingRules>
    

那时最简单的解决方案是实现一个 Django 中间件用于跨域共享

于 2013-06-25T13:39:59.893 回答