使django处理子域后缀

Make django handle subdomain suffix

我们在我们的网络服务器上托管了几个 docker 化的网络应用程序,我们称之为 group.example.com。我们的子域是通过 nginx 作为后缀处理的,它转换为像 group.example.com/app1/ group.example.com/app2/ 这样的根 url。

使用 Django 时,我们 运行 遇到了问题,因为 url<a href="{% url 'index' %}">home</a> 等模板中生成的所有 url 都是相对的 links,所以渲染到 <a href="/">home</a>。这个相关 link 将不会被正确解释,导致主页面,非应用程序页面 group.example.com

所以目标是为所有 link 提供一个基于应用程序的前缀,例如 /app1/。我可以为静态 links 硬编码这些,但必须有更优雅的方式。这也会导致提交到错误页面的使用表单出现问题 - 再次重定向回主页面,非应用程序页面 group.example.com

我尝试将 /app1/ 添加到所有已注册的网址作为前缀,但这似乎也不起作用 - 这样应用程序 运行ning 但用户需要访问 group.example.com/app1/app1/ 获取索引,相对 links 仍然不能正常工作。

在应用 docker 容器中,我们 运行 使用 nginxuwsgi 连接网络应用。当使用 app1.example2.com 等正确的子域时它工作正常 - 但我们在我们想要托管应用程序的新的更快的网络服务器上没有这种能力。

有没有办法使用应用程序容器 nginxuwsgidjango/中间件配置来解决此问题,让 link 解析为 group.example.com/app1/ 作为 root?

据我所知,有两种方法可以解决

一个 在 NGINX 配置中使用 SCRIPT_NAME。比如基于这个server fault answer:

location /app1/ {
    SCRIPT_NAME /app1;
    # rest of the config
}

两个 你可以在你的settings.py中加上FORCE_SCRIPT_NAME:

FORCE_SCRIPT_NAME = '/app1'

仅供参考,我更喜欢使用第一种解决方案。