- Вопрос или проблема
- Простой рабочий процесс (не нужно ничего устанавливать)
- файл hosts (добавьте запись)
- конфигурация httpd.conf (включить виртуальные хосты)
- конфигурация httpd-vhosts.conf
- создайте pac файл:
- Ответ или решение
- Альтернативные способы решения проблемы
- Тестирование с Django Dev Server
- Заключение
Вопрос или проблема
Мне нужно протестировать поддомены на моем локальном сервере. Как я могу эффективно добиться этого, добавив *.localhost.com
в файл /etc/hosts/
?
Если это невозможно, как мне обойти эту проблему? Мне нужно протестировать поддомены с подстановочными знаками на моем локальном сервере. Это сервер разработки Django, может ли сервер разработки Django обрабатывать поддомены? Может ли какое-то другое программное обеспечение/маршрутизация дать мне желаемый результат?
Я написал dns proxy на Python. Он будет считывать записи подстановочных знаков в /etc/hosts. Смотрите здесь: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py
Установите dnsmasq (я делаю это на всех своих Linux рабочий столах, как кэш DNS). В dnsmasq.conf
добавьте строку:
address=/localhost.com/127.0.0.1
Невозможно указать подстановочные знаки в файле /etc/hosts
. Либо укажите необходимые имена хостов явно, либо настройте локальный сервер имен с соответствующими правилами.
Вам нужно настроить DNS-сервер и заставить каждого клиента использовать его для разрешения. Сам сервер может быть чем-то таким “легким”, как dnsmasq или таким тяжелым, как BIND.
Простой рабочий процесс (не нужно ничего устанавливать)
Я лично предпочитаю создать PAC файл для этого и заставить свой браузер просто его использовать.
Шаг 1: создайте файл, например: *.proxy.pac*
где-нибудь (я использую свою папку $home
)
Шаг 2: вставьте этот код (пример с портом 8000):
function FindProxyForURL(url, host) {
if (shExpMatch(host, "*localhost")) {
return "PROXY localhost:8000";
}
return "DIRECT";
}
Шаг 3:
Заставьте свой браузер использовать этот PAC файл.
Шаг 4:
Теперь вы можете протестировать свое приложение, обратившись к: http://mysubdomain.localhost/
Шаг 5: Наслаждайтесь 🙂
Я привел в порядок один из своих старых проектов:
https://github.com/airtonix/avahi-aliases
Требования:
- Linux, где avahi и python-avahi могут быть установлены
- вам не страшны .local домены (avahi не поддерживает другие типы)
Преимущества перед использованием dnsmasq или python dns proxy:
- другие пользователи avahi/bonjour в вашей локальной сети могут разрешать имена, которые вы создаете и объявляете в сети (при условии, что вы разрешаете доступ к порту 5353)
Вы не можете использовать подстановочный знак в /etc/hosts
.
Посмотрите здесь для хорошего руководства о том, как это сделать на OS X с использованием BIND, встроенного, но неактивного DNS-сервера, и Apache.
Это решение на основе DNS идеально сработало в моем случае, без необходимости устанавливать что-либо: https://gist.github.com/fedir/04e60d679d5657d1f9f9aa10b3168282 (Mac OSX 10.9)
Если вы хотите использовать dnsmasq
с NetworkManager
, вы можете (или даже должны?) запустить dnsmasq
из NetworkManager
, добавив
dns=dnsmasq
в /etc/NetworkManager/NetworkManager.conf
. Затем конфигурация dnsmasq переходит в /etc/NetworkManager/dnsmasq.conf
или /etc/NetworkManager/dnsmasq.d/
соответственно.
Копируя из этого блога, вот как это сделать на Mac:
https://hedichaibi.com/how-to-setup-wildcard-dev-domains-with-dnsmasq-on-a-mac/
~ brew install dnsmasq
~ vim /usr/local/etc/dnsmasq.conf # или /opt/homebrew/etc/dnsmasq.conf
# Этот файл будет добавлен к конфигурации
conf-file=/Users/your_user_name/.dnsmasq/dnsmasq.conf
~ vim /Users/your_user_name/.dnsmasq/dnsmasq.conf
# example.localhost будет разрешен как 127.0.0.1, включая поддомены
address=/example.localhost/127.0.0.1
listen-address=127.0.0.1
~ sudo brew services stop dnsmasq
~ sudo brew services start dnsmasq
Нам нужно сказать macOS использовать 127.0.0.1 в качестве первого резолвера DNS.
Краткий ответ:
Ваш файл /etc/hosts/ не позволит вам использовать подстановочные знаки или номера портов. Вам нужно будет создать одну запись для каждого из ваших поддоменов.
Краткий ответ: вы не можете. Более длинный ответ: вам нужно четче обозначить, что вы хотите на самом деле достичь, потому что, возможно, есть либо лучший способ, либо другой способ достижения этого.
Для веб-хостинга (я никогда не видел, чтобы это использовалось иначе) это делается в DNS в сочетании с веб-сервером, который учитывает виртуальный хостинг. Для получения дополнительной информации о записях DNS с подстановочными знаками (Wikipedia) и статью Виртуальный хостинг с Apache и Bind для Linux с использованием bind и Apache.
В худшем случае, я думаю, вы можете использовать локальный DNS-сервер.
Обычная задача по этой теме — сопоставление директорий с поддоменами. Очень простой способ сделать это — автоматически добавлять записи на основе директорий в файл hosts:
#!/usr/bin/python import os hostsFile = open("/etc/hosts", "a+"); lines = hostsFile.readlines() for fileName in os.listdir('/opt/subdomainDirs'): entryExists = False for line in lines: if fileName in line: entryExists = True if not entryExists: hostsFile.write("127.0.0.1 " + fileName + ".localhost\n");
Спасибо tschundeee за то, что я считаю окончательным ответом на эту проблему, хотел бы просто оставить комментарий, но вот полная конфигурация для тех, кто пытается достичь первоначальной цели (все подстановочные знаки указывают на одну и ту же кодовую базу — ничего не устанавливайте, среда разработки, т.е. XAMPP)
файл hosts (добавьте запись)
файл: /etc/hosts (не Windows)
127.0.0.1 example.local
конфигурация httpd.conf (включить виртуальные хосты)
файл: /XAMPP/etc/httpd.conf
# Виртуальные хосты
Include etc/extra/httpd-vhosts.conf
конфигурация httpd-vhosts.conf
файл: XAMPP/etc/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/path_to_XAMPP/htdocs"
ServerName example.local
ServerAlias *.example.local
# SetEnv APP_ENVIRONMENT development
# ErrorLog "logs/example.local-error_log"
# CustomLog "logs/example.local-access_log" common
</VirtualHost>
перезапустите apache
создайте pac файл:
сохраните как whatever.pac где хотите, а затем загрузите файл в настройки сети браузера>прокси>автоматическая конфигурация (перезагрузите, если измените это)
function FindProxyForURL(url, host) {
if (shExpMatch(host, "*example.local")) {
return "PROXY example.local";
}
return "DIRECT";
}
dnsmasq сработал для меня, кроме того, что мне пришлось сделать некоторые дополнительные шаги.
Вот полная процедура:
-
Добавьте в начало
/etc/resolv.conf
следующую строкуnameserver 127.0.0.1
-
Добавьте следующие строки в
/etc/dnsmasq.conf
listen-address=127.0.0.1 address=/localhost.localdomain/127.0.0.1 address=/localhost/127.0.0.1
-
Перезапустите dnsmasq (не просто указывайте dnsmasq на перезагрузку конфигурационных файлов)
Это может быть и не нужно.
Суффикс .localhost
должен по умолчанию указывать на 127.0.0.1 в вашей ОС.
Я в настоящее время использую Ubuntu 20.04.5 LTS, и это работает из коробки без установки каких-либо дополнительных пакетов.
Так что вы можете называть свои тестовые домены как mytestdomain.localhost
, и это будет указывать на 127.0.0.1. Все, что имеет суффикс .localhost
, будет указывать на 127.0.0.1.
Попробуйте это: ping helloworld.localhost
, должно указывать на localhost.
$ ping test.localhost
PING test.localhost(ip6-localhost (::1)) 56 data bytes
64 bytes from ip6-localhost (::1): icmp_seq=1 ttl=64 time=0.023 ms
64 bytes from ip6-localhost (::1): icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from ip6-localhost (::1): icmp_seq=3 ttl=64 time=0.043 ms
64 bytes from ip6-localhost (::1): icmp_seq=4 ttl=64 time=0.079 ms
64 bytes from ip6-localhost (::1): icmp_seq=5 ttl=64 time=0.053 ms
Это поведение описано в этом RFC2606 https://datatracker.ietf.org/doc/html/rfc2606#section-2
Также описано здесь: https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html#Synthetic%20Records
Недавно я искал похожее решение и обнаружил проект localhost.direct.
Эти ребята реализовали блестящую идею, которая работает на любой ОС. Вам не нужно ничего устанавливать.
SSL сертификаты включены.
На Ubuntu 22.04 со включенными Snaps nss-myhostname
выглядит как включенным, или может также существовать пакет APT libnss-myhostname
. Похоже, вы можете использовать любые *.localhost
(или *.localhost.localdomain
) без какой-либо конфигурации:
$ getent ahosts xxx.yyy.localhost
::1 STREAM xxx.yyy.localhost
::1 DGRAM
::1 RAW
127.0.0.1 STREAM
127.0.0.1 DGRAM
127.0.0.1 RAW
Если вы не против полагаться на сторонний доменный сервер, существуют различные простые варианты (никаких изменений в локальной ОС не требуется). Например, xxx.yyy.127.0.0.1.nip.io
будет разрешено как 127.0.0.1
. Документация
Ответ или решение
Для тестирования поддоменов на вашем локальном сервере с использованием файла /etc/hosts
на Linux или macOS необходимо учитывать, что непосредственно с помощью этого файла создать wildcard (шаблонный) поддомен, такой как *.localhost.com
, невозможно. Формат файла /etc/hosts
не поддерживает использование символов подстановки.
Альтернативные способы решения проблемы
-
Использование DNS-сервера, например, dnsmasq:
- Установите
dnsmasq
, который позволит вам управлять настройками локального DNS. - В конфигурационном файле
dnsmasq.conf
добавьте строку:address=/localhost.com/127.0.0.1
- Перезапустите
dnsmasq
для применения изменений. Убедитесь, что ваш/etc/resolv.conf
настроен на использование127.0.0.1
в качестве DNS-сервера.
- Установите
-
Настройка BIND:
- На macOS и Linux вы можете установить и настроить BIND для создания wildcard-записей. Это потребует больше усилий, но предоставит более глубокую интеграцию и возможности управления.
- Например, создайте файл зон и настройте его так, чтобы он обслуживал запросы на поддомены.
-
Использование файла PAC для прокси:
- Вы можете создать PAC-файл, который будет направлять запросы на нужные поддомены через указанный прокси-сервер. Пример кода в PAC-файле:
function FindProxyForURL(url, host) { if (shExpMatch(host, "*localhost")) { return "PROXY localhost:8000"; } return "DIRECT"; }
- Ваш браузер должен быть настроен на использование этого PAC-файла.
- Вы можете создать PAC-файл, который будет направлять запросы на нужные поддомены через указанный прокси-сервер. Пример кода в PAC-файле:
-
Системы с поддержкой .localhost:
- Некоторые дистрибутивы Linux (например, Ubuntu) поддерживают поддомены с окончанием
.localhost
по умолчанию. Вы можете просто использоватьmysubdomain.localhost
, и он автоматически будет резолвиться в127.0.0.1
.
- Некоторые дистрибутивы Linux (например, Ubuntu) поддерживают поддомены с окончанием
-
Автоматизация записей в hosts:
- Если вам нужно часто добавлять поддомены, вы можете создать скрипт на Python, который будет автоматически добавлять нужные записи в файл
/etc/hosts
на основе содержимого определенной директории.
- Если вам нужно часто добавлять поддомены, вы можете создать скрипт на Python, который будет автоматически добавлять нужные записи в файл
Тестирование с Django Dev Server
Django dev server, по умолчанию, не поддерживает wildcard-поддомены напрямую, но вы можете настроить его на работу с поддоменами, если указать их в файле urls.py
. Убедитесь, что ваш сервер корректно обрабатывает запросы к различным поддоменам.
Заключение
Несмотря на ограничения файла /etc/hosts
, с помощью инструментов, таких как dnsmasq
или использование .localhost
доменов, вы сможете успешно тестировать поддомены на своем локальном сервере. Каждый из предложенных методов имеет свои преимущества и целесообразен в зависимости от ваших потребностей и уровня удобства с конкретными инструментами.