2

フロントエンド(静的)とバックエンド(API)が、同じドメインを共有することを除いて、完全に分離されているWebアプリを構築したいと思います。通常、これは問題ないと思いますが、いくつかの特別な要件があります。

  • APIはHerokuで実行されます(DjangoとTastyPieを使用)
  • HTMLファイルを含むすべての静的コンテンツはAmazonS3でホストされます

フロントエンドアプリは単一ページのJavascriptアプリケーション(ベーステンプレートを使用し、それを呼び出すことができますindex.html)であり、AJAXを介してAPIからコンテンツを入力します。APIにCORSをまだ実装したくないので、同一生成元ポリシーに従いたいので、APIとS3(バケット)上のファイルの両方が何らかの方法で同じドメインを共有している必要があります。また、Djangoのフラットページアプリを使用したり、Djangoを介してレンダリングしたりすることもまったくありませんindex.html

Googleとstackoverflowをスキャンしましたが、これまでのところ適切な解決策を見つけることができませんでした。私が素朴な方法(ドメインをHerokuアプリとS3バケットにポイントする)を読んでいる限り、それは不可能です。私が考えているいくつかの解決策は、次のソースを見つけられませんでした:

  • 可能であれば、ドメイン名をHerokuのAPIとS3バケットにポイントします
  • いくつかのオプションをHerokuに渡して、S3でホストされているhtml(ProcFile?)をレンダリングし、DjangoとS3のライブラリを使用して他の静的アセットを取得します
  • 多分これを達成するためにボトで何かをしている
  • 他の完全に異なる提案?

誰かが以前にこのようなことを試みて、私を正しい方向に向けることができましたか?

追加:後で、lile PhantomJSを使用して、シングルページアプリをクロール可能にします。クローラーのこの出力は、理想的にはS3ストレージでもホストする必要があります。

4

1 に答える 1

1

これは、現在のスタックでは不可能です。

HerokuアプリケーションとS3バケットは、実際には2つの異なるドメインを介して提供されます。2つの異なるドメインを持つことの利点は、すべての静的アセット要求からサーバーをオフロードできることです。

必要なことを実現するための複雑な方法は、1つの一意のドメインを介してリクエストを適切にプロキシすることです。幸いなことに、HerokuもAmazonもそれを許可しません。

  • staticNginxはフォルダーをプロキシすることyour-api.herokuapp.comできますが、Herokuでnginxを構成することはできません。これは、そもそもPaaSを使用する目的を損なうことになります。
  • S3は、Webサイトをホスト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 に答える