如何最好地在同一服务器上托管Django web应用程序,但要托管两个独立的域?
我有一个Django web应用程序,部署了Apache+mod_wsgi,我想通过两个独立的域(例如wwww.mydomain.com和www.otherdomain.com)访问它。这两个域共享相同的数据库和用户帐户,但具有特定于域的功能(主要是美观性,显示不同的模板、图形和一些额外的工具等)。
每个域也有自己的SSL证书。用户也有可能在域之间来回切换(例如,他们从mydomain.com开始,然后"启用"功能,将他们带到otherdomain.com)
起初,我认为我所要做的就是将域附加到Apache conf文件中的ServerAlias指令中。例如CCD_ 1。然而,我遇到了一些问题。
-
如果我读对了,一个Apache部分只能支持一个域的证书(不包括子域的通配符证书),所以为了在两个域上支持HTTPS,我需要复制我的证书,将不同的证书信息交换到第二个域。
-
为了正确跟踪cookie,我需要将
SESSION_COOKIE_DOMAIN
和CSRF_COOKIE_DOMAIN
设置为正在使用的域。然而,这只能在每个settings.py中完成一次,如本文所述,我需要创建重复的settings.py文件(例如settings_mydomain.py和settings_otherdomain.py)以及重复的django.wsgi文件,每个文件都使用适当的设置模块。 -
使用默认设置,如果用户从一个域跳到另一个域,他们将丢失所有cookie,导致他们在登录时被注销。我不知道如何最好地解决这个问题。由于用户被Django视图重定向,起初我想我可以复制cookie,将旧域换成新域。另一个想法是将cookie复制到一个数据库表中,用一次性查找哈希进行索引(例如,与Django进行注册确认的方式相同),并将该哈希包含在重定向中,然后应用程序将使用该哈希来查找cookie并在客户端中设置它们。这两种都行吗?
这三个问题有更好的解决方案吗?还有其他我忽略的问题吗?
快速修复是使用多个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,你将能够设置多个域。