2

Django Web アプリを同じサーバー上で 2 つの別々のドメインでホストするにはどうすればよいですか?

Apache+mod_wsgi でデプロイされた Django Web アプリケーションがあり、2 つの別個のドメイン (www.mydomain.com と www.otherdomain.com など) を介してアクセスしたいと考えています。両方のドメインは同じデータベースとユーザー アカウントを共有しますが、ドメイン固有の機能 (ほとんどの場合美的、異なるテンプレートの表示、グラフィック、いくつかの追加ツールなど) があります。

各ドメインには独自の SSL 証明書もあります。また、ユーザーがドメイン間でバウンスされる可能性もあります (たとえば、ユーザーは mydomain.com から始めて、otherdomain.com に移動する機能を「有効化」します)。

最初は、Apache conf ファイルの ServerAlias ディレクティブにドメインを追加するだけでよいと考えていました。例えばServerAlias *mydomain.com *otherdomain.com。ただし、いくつかの問題が発生しています。

  1. これを正しく読んでいる場合、単一の Apache セクションは1 つのドメインの証明書のみをサポートできます (サブドメインのワイルドカード証明書を除く)。したがって、両方のドメインで HTTPS をサポートするには、 my を複製し、別の証明書情報を交換する必要があります。 2 番目のドメイン用。

  2. Cookie を適切に追跡するには、使用しているドメインを設定する必要がありSESSION_COOKIE_DOMAINますCSRF_COOKIE_DOMAIN。ただし、これは settings.py ごとに 1 回しか実行できないため、ここで概説するように、重複する settings.py ファイル (たとえば、settings_mydomain.py と settings_otherdomain.py) と重複する django.wsgi ファイルを作成し、それぞれ適切な設定を使用する必要があります。モジュール。

  3. デフォルトの設定では、ユーザーがあるドメインから別のドメインにバウンスされた場合、すべての Cookie が失われ、ログインしている場合でもログアウトされます。これを回避する最善の方法がわかりません。ユーザーは Django ビューによってリダイレクトされているため、最初は Cookie をコピーして、古いドメインを新しいドメインに交換できると考えていました。もう 1 つの考えは、Cookie をデータベース テーブルにコピーし、1 回限りのルックアップ ハッシュでインデックスを作成し (たとえば、Django が登録確認を行うのと同じ方法で)、リダイレクトにこのハッシュを含めることです。それらをクライアントに設定します。これらのいずれかが機能しますか?

これら3つの問題に対するより良い解決策はありますか? 私が見落とした他の問題や問題はありますか?

4

1 に答える 1

0

クイックフィックスは、次のような複数のApache仮想ホストブロックを使用することです。

<VirtualHost ´your server IP here´:´server port´>
  ServerName mydomain.com
  WSGIDaemonProcess mydomain display-name=mydomain
  WSGIProcessGroup mydomain
  WSGIScriptAlias / /path/to/your/django/project/wsgi.py
  Alias /static /path/to/your/django/project/static/
</VirtualHost>

<VirtualHost ´your server IP here´:´server port´>
  ServerName otherdomain.com
  WSGIDaemonProcess otherdomain display-name=otherdomain
  WSGIProcessGroup otherdomain
  WSGIScriptAlias / /path/to/same/django/project/as/above/wsgi.py
  Alias /static /path/to/your/django/project/static/
</VirtualHost>

次に、HttpRequest.META SERVER_NAMEの値を、テンプレートフォルダー内のフォルダー区切り文字として使用し、テンプレートを要求するときに次のように使用します。

def my_server_sensitive_view(request):
  return render_to_response('%(SERVER_NAME)s/index.html' % request.META, 
    {"foo": "bar"})

2つのサイト間でコンテンツを分離する必要があるが、それらの間で相互公開する可能性が必要な場合は、django.contrib.sitesを使用して、複数のドメインを設定できます。

于 2012-09-20T21:14:12.907 に答える