Skip to main content
 首页 » 编程设计

python之通过两个单独的域访问 Django Web 应用程序

2025年05月04日32del

如何最好地在同一台服务器上为两个不同的域托管 Django 网络应用程序?

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

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

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

  1. 如果我正在阅读 this正确地,单个 Apache 部分只能支持一个域的证书(不包括子域的通配符证书),因此为了在两个域上都支持 HTTPS,我需要复制我的,交换不同的证书第二个域的信息。

  2. 为了正确跟踪 cookie,我需要将 SESSION_COOKIE_DOMAIN 和 CSRF_COOKIE_DOMAIN 设置为正在使用的域。然而,这只能在每个 settings.py 中完成一次,如此概述 here ,我需要创建重复的 settings.py 文件(例如 settings_mydomain.py 和 settings_otherdomain.py)以及重复的 django.wsgi 文件,每个文件都使用适当的设置模块。

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

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

请您参考如下方法:

快速修复是使用多个 Apache Virtual Host block 状

<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您将能够设置多个域。