Где настроить маршрутизацию по поддомену? 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 — так, чтобы это происходило каждый раз при создании пользователя, — скорее всего, будет сложно.
Я надеюсь, что этот ответ поможет вам пересмотреть или прояснить ваш сценарий.