2

如何最好地将 Django Web 应用程序托管在同一台服务器上,但用于两个不同的域?

我有一个使用 Apache+mod_wsgi 部署的 Django Web 应用程序,我想通过两个单独的域(例如 wwww.mydomain.com 和 www.otherdomain.com)访问它。两个域共享相同的数据库和用户帐户,但具有特定于域的功能(主要是美学,显示不同的模板、图形、一些额外的工具等)。

每个域也有自己的 SSL 证书。用户也有可能在域之间被反弹(例如,他们从 mydomain.com 开始,然后他们“启用”将他们带到 otherdomain.com 的功能)。

起初我认为我所要做的就是将域附加到我的 Apache conf 文件中的 ServerAlias 指令中。例如ServerAlias *mydomain.com *otherdomain.com。但是,我遇到了一些问题。

  1. 如果我没看错话,一个 Apache 部分只能支持一个域的证书(不包括子域的通配符证书),所以为了在两个域上支持 HTTPS,我需要复制我的,交换不同的证书信息对于第二个域。

  2. 为了正确跟踪 cookie,我需要设置SESSION_COOKIE_DOMAINCSRF_COOKIE_DOMAIN到正在使用的域。但是,每个 settings.py 只能执行一次,因此此处概述,我需要创建重复的 settings.py 文件(例如 settings_mydomain.py 和 settings_otherdomain.py)以及重复的 django.wsgi 文件,每个文件都使用适当的设置模块。

  3. 在默认设置下,如果用户从一个域跳到另一个域,他们将丢失所有 cookie,导致他们在登录后被注销。我不确定如何最好地解决这个问题。由于用户被 Django 视图重定向,起初我想我可以复制 cookie,将旧域换成新域。另一个想法是将 cookie 复制到数据库表中,使用一次性查找哈希进行索引(例如,与 Django 进行注册确认的方式相同),并将此哈希包含在重定向中,然后应用程序将使用该哈希来查找 cookie 和将它们设置在客户端中。这些中的任何一个都可以吗?

这三个问题有没有更好的解决方案?还有其他我忽略的问题或问题吗?

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"})

如果您需要在两个站点之间分离内容但仍需要在它们之间交叉发布,那么使用django.contrib.sites您将能够设置多个域。

于 2012-09-20T21:14:12.907 回答