Где настроить маршрутизацию по поддомену? Front-end (React) или Django (серверная часть)?

В настоящее время я создаю многопользовательское веб-приложение, используя Django и React. Прямо сейчас страница каждого пользователя доступна по URL-адресу, например https://mywebsite.com/. Однако я хочу изменить это так, чтобы у каждого пользователя был свой собственный поддомен, например: https://username.mywebsite.com.

Мои настройки следующие: я использую React для интерфейса и Django (с Django REST Framework) для серверной части. Оба они запущены на одном сервере. Я обслуживаю папку React build/ напрямую через Django, подключив ее в файле Django urls.py.

Чего я хочу добиться, так это настоящей маршрутизации на основе поддоменов, чтобы у каждого пользователя или арендатора мог быть свой собственный поддомен. Я не уверен, какие именно изменения необходимы, чтобы это заработало, особенно на разных уровнях стека. В частности, я хочу понять, что нужно сделать на уровне конфигурации DNS или Nginx/сервера, какие изменения мне нужно внести в Django для обнаружения и обработки поддоменов и нужны ли какие-либо обновления на стороне React. Мне также интересно, есть ли способ протестировать такую настройку поддомена локально во время разработки (например, на localhost).

Наконец, я хотел бы знать, как извлечь поддомен (который будет именем пользователя или идентификатором арендатора) в Django и направить запрос соответствующим образом.

Если кто-нибудь сможет направить меня в правильном направлении, это было бы огромной помощью.

Разрешение доступа к поддоменам - это вопрос DNS, а не серверной части/интерфейса.

Но вы можете добавить *.yourdomain.com и обрабатывать логику на стороне сервера

В таком случае, на ваш вопрос уже был дан ответ здесь Использование поддоменов в django

1. Подход на уровне DNS

Проще говоря, домен - это просто удобочитаемая версия IP-адреса. IP-адрес, в свою очередь, указывает на сервер в сети. Как правило, разные домены ведут к разным серверам, и это также относится к поддоменам. Вот пример:

stackoverflow.com → 10.1.1.1
meta.stackoverflow.com → 20.1.1.1

Но, насколько я понимаю, похоже, что все поддомены должны указывать на один сервер (=ваш сервер django/react)

user1.yourservice.com → 30.1.1.1
user2.yourservice.com → 30.1.1.1

Это технически возможно, но может оказаться неуместным. Причина в том, что большинство DNS-сервисов, таких как AWS Route53, накладывают ограничения на количество поддоменов, которые вы можете создать. Таким образом, если у вас большое количество пользователей, каждому из которых требуется поддомен, будет сложно назначить его каждому пользователю.

Кроме того, всякий раз, когда регистрируется новый пользователь, вам необходимо зарегистрировать новый поддомен у вашего DNS—провайдера - задача, которая не может быть решена на уровне Django.

2. Подход на уровне веб-сервера

Однако, при необходимости, веб-сервер (например, Nginx) должен обрабатывать сопоставление поддоменов с определенными подкаталогами. Конкретная конфигурация Nginx может отличаться, поэтому, пожалуйста, примите это только как концептуальную идею.

# main service
server {
    listen 80;
    server_name localhost;

location / {
    root   /path/to/your/django/project/;
    proxy_pass   http://yourservice.com:8000;
    }
}

# for each user
# This configuration is used to link subdomains to individual user pages, such as profile pages.

server {
    listen 80;
    server_name ~^(.*)\.yourservice\.com; # user1.yourservice.com

location / {
    proxy_pass http://yourservice.com/$1; # to yourservice.com/user1
    }
}

# Or, And in this case, each user can access the service entirely through their own subdomain.

server {
    listen 80;
    server_name ~^(.*)\.yourservice\.com;

location / {
    proxy_pass http://yourservice.com;
    }
}

3. Подход на уровне веб-приложения

Я не знаю вашего конкретного сценария — нужно ли перенаправлять только определенные страницы для каждого пользователя (например, страницы профиля) на поддомен, или каждый пользователь должен получать доступ к сервису исключительно через свой собственный поддомен.

Однако, поскольку вы используете поддомены, вам необходимо будет задать некоторые параметры конфигурации. Например, вам может потребоваться добавить поддомены в ALLOWED_HOSTS или CSRF_TRUSTED_ORIGINS в settings.py. Возможно, вам также потребуется соответствующим образом обновить ссылки в ваших шаблонах. Эти детали будут зависеть от вашего конкретного сценария.

4. Настройка поддомена для локальной разработки

Настроив файл hosts, вы сможете получить доступ к своему локальному хосту, используя (поддомены). В Windows файл hosts находится по адресу C:\Windows\System32\drivers\etc\hosts, а в macOS - по адресу /private/etc/hosts. Это должно сработать, если вы измените его следующим образом.

127.0.0.1   yourservice.com
127.0.0.1   user1.userservie.com
127.0.0.1   user2.userservie.com
...

Концепция сопоставления поддомена с IP-адресом в вашем локальном файле hosts по сути такая же, как и при использовании DNS. Однако по разным причинам автоматизировать этот процесс в Django — так, чтобы это происходило каждый раз при создании пользователя, — скорее всего, будет сложно.

Я надеюсь, что этот ответ поможет вам пересмотреть или прояснить ваш сценарий.

Вернуться на верх