Сделать django дескриптор поддомена суффикс - PullRequest
1 голос
/ 22 апреля 2020

На нашем веб-сервере мы размещаем несколько докеризированных веб-приложений, назовем это group.example.com. Наши субдомены обрабатываются через nginx как суффиксы, что означает что-то вроде group.example.com/app1/ group.example.com/app2/ как root urls.

При использовании Django мы сталкиваемся с проблемами, так как все его URL-адреса, сгенерированные url в шаблонах, таких как <a href="{% url 'index' %}">home</a>, будут относительными ссылками, поэтому отображаются в <a href="/">home</a>. Эта относительная ссылка не будет правильно интерпретироваться, что приведет к главной странице, не относящейся к приложению group.example.com.

Таким образом, цель состоит в том, чтобы иметь префикс на основе приложения, такой как /app1/ для всех ссылок. Я могу жестко закодировать их для ссылок c, но должен быть более элегантный способ. Также это приводит к проблеме с отправкой использованных форм на неправильную страницу - повторное перенаправление обратно на главную страницу, не относящуюся к приложению group.example.com.

Я попытался добавить /app1/ ко всем зарегистрированным URL-адресам в качестве префикса, но, похоже, это тоже не работает - так работает приложение, но пользователю нужно будет посетить group.example.com/app1/app1/, чтобы попасть в индекс, и относительные ссылки все еще не работают правильно.

В приложении docker -container мы запускаем веб-приложение с nginx и uwsgi. Он отлично работает при использовании правильных поддоменов, таких как app1.example2.com, но у нас нет такой возможности на нашем новом быстром веб-сервере, на котором мы хотим разместить приложение.

Есть ли способ решить эту проблему, используя контейнеры приложения nginx, uwsgi или django / middleware config, чтобы получить ссылки для разрешения group.example.com/app1/ как root?

1 Ответ

1 голос
/ 22 апреля 2020

Насколько я знаю, есть два способа ее решения.

Один использует SCRIPT_NAME в конфигурации NGINX. Например, на основе этого ответа о сбое сервера :

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

Два Вы можете добавить FORCE_SCRIPT_NAME в ваших settings.py:

FORCE_SCRIPT_NAME = '/app1'

К вашему сведению, я бы предпочел использовать первое решение.

...