В моем файле /etc/hosts/ на Linux/OSX, как мне сделать поддомен с подстановочным знаком?

Вопрос или проблема

Мне нужно протестировать поддомены на моем локальном сервере. Как я могу эффективно добиться этого, добавив *.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 файл.

Видеоурок по PAC & Firefox

Шаг 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 сработал для меня, кроме того, что мне пришлось сделать некоторые дополнительные шаги.

Вот полная процедура:

  1. Добавьте в начало /etc/resolv.conf следующую строку

     nameserver 127.0.0.1
    
  2. Добавьте следующие строки в /etc/dnsmasq.conf

     listen-address=127.0.0.1
     address=/localhost.localdomain/127.0.0.1
     address=/localhost/127.0.0.1
    
  3. Перезапустите 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 не поддерживает использование символов подстановки.

Альтернативные способы решения проблемы

  1. Использование DNS-сервера, например, dnsmasq:

    • Установите dnsmasq, который позволит вам управлять настройками локального DNS.
    • В конфигурационном файле dnsmasq.conf добавьте строку:
      address=/localhost.com/127.0.0.1
    • Перезапустите dnsmasq для применения изменений. Убедитесь, что ваш /etc/resolv.conf настроен на использование 127.0.0.1 в качестве DNS-сервера.
  2. Настройка BIND:

    • На macOS и Linux вы можете установить и настроить BIND для создания wildcard-записей. Это потребует больше усилий, но предоставит более глубокую интеграцию и возможности управления.
    • Например, создайте файл зон и настройте его так, чтобы он обслуживал запросы на поддомены.
  3. Использование файла PAC для прокси:

    • Вы можете создать PAC-файл, который будет направлять запросы на нужные поддомены через указанный прокси-сервер. Пример кода в PAC-файле:
      function FindProxyForURL(url, host) {
       if (shExpMatch(host, "*localhost")) {
           return "PROXY localhost:8000";
       }
       return "DIRECT";
      }
    • Ваш браузер должен быть настроен на использование этого PAC-файла.
  4. Системы с поддержкой .localhost:

    • Некоторые дистрибутивы Linux (например, Ubuntu) поддерживают поддомены с окончанием .localhost по умолчанию. Вы можете просто использовать mysubdomain.localhost, и он автоматически будет резолвиться в 127.0.0.1.
  5. Автоматизация записей в hosts:

    • Если вам нужно часто добавлять поддомены, вы можете создать скрипт на Python, который будет автоматически добавлять нужные записи в файл /etc/hosts на основе содержимого определенной директории.

Тестирование с Django Dev Server

Django dev server, по умолчанию, не поддерживает wildcard-поддомены напрямую, но вы можете настроить его на работу с поддоменами, если указать их в файле urls.py. Убедитесь, что ваш сервер корректно обрабатывает запросы к различным поддоменам.

Заключение

Несмотря на ограничения файла /etc/hosts, с помощью инструментов, таких как dnsmasq или использование .localhost доменов, вы сможете успешно тестировать поддомены на своем локальном сервере. Каждый из предложенных методов имеет свои преимущества и целесообразен в зависимости от ваших потребностей и уровня удобства с конкретными инструментами.

Оцените материал
Добавить комментарий

Капча загружается...