В моем / etc / hosts / file в Linux / OSX как мне сделать субдомен подстановочного знака?

170

Мне нужно протестировать субдомены на моем локальном хосте. Как эффективно получить результат добавления *.localhost.comв мой /etc/hosts/файл?

Если это невозможно, как мне обойти эту проблему? Мне нужно проверить поддомены подстановочных знаков на моем локальном сервере. Это сервер разработки Django, может ли сервер разработки Django обрабатывать субдомены? Может ли какой-то другой программный продукт / маршрутизация дать мне желаемый конечный результат?

MikeN
источник
1
Принадлежит суперпользователю?
Пол Р
Я знаю, что люди говорят, что это невозможно! Но как мне это сделать в любом случае! Что-то вне / etc / hosts / я могу использовать для получения эффекта. Я тестирую сервер разработки.
MikeN
на суперпользователя: unix.stackexchange.com/questions/3352/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
Поскольку большинство ответов сфокусировано на вашем первом вопросе (подстановочные знаки субдоменов localhost), я отвечу на ваш вторичный вопрос в качестве комментария: да, сервер Django dev вполне способен обрабатывать субдомены localhost, вам просто нужно убедить свой браузер и свою ОС чтобы отправить трафик в его сторону (используя одно из различных решений ниже)!
hheimbuerger

Ответы:

44

Я написал прокси-сервер DNS в Python. Он будет читать записи с подстановочными знаками в / etc / hosts. Смотрите здесь: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py

marlonyao
источник
Это потрясающе! Я долго искал простое решение, подобное этому (Работа над OSX Mavericks BTW)
Билли Мун
2
теперь, если бы мы только могли pip installэто сделать :)
metakermit
1
Я установил это, сделал все и запустил, но он не блокирует сайты.
DisplayName
Не могу отказать этому достаточно. Я нуждался в этом навсегда, наткнулся на эту жемчужину вопросов и ответов, и я немного хакер Python, и это аккуратный лакомый кусочек. Спасибо, что поделился!
Фарли
153

Установите dnsmasq (в любом случае я делаю это на всех своих рабочих столах в Linux как DNS-кеш). В dnsmasq.confдобавьте строку:

address=/localhost.com/127.0.0.1
Томчук
источник
7
Brilliant! Примечание для пользователей Mac, это действительно так просто: 1. sudo port install dnsmasq2. редактировать /opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
TomC
17
OSX с brew: то же самое, что и выше, но установка brew dnsmasq
Мэтт Хамфри,
1
fyi brew> port (предложение re @MattHumphrey)
electblake
1
Этот пример не работает для меня, возможно, потому что я использую vagrantup.com для локального обслуживания. Не волнуйтесь, я уже сменил IP на правильный, 192.168.50.11но DNS не разрешается. Любые идеи, этот пример правильный для "не 127.0.0.1" IP?
Брайан
6
Отличный совет. Для рабочего стола Ubuntu 14.04 (который по умолчанию запускает dnsmasq) создайте файл с именем /etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.confи вставьте в него строку address=/localhost.com/127.0.0.1, затем перезапустите.
user38397
60

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

ар.
источник
15

Вам необходимо настроить DNS-сервер, чтобы каждый клиент использовал его для разрешения. Сам сервер может быть чем-то таким «легким», как dnsmasq, или таким же тяжелым, как BIND .

Джеральд Комбс
источник
+1 для dnsmasq, который действительно хорошо документирован и прост в использовании
Дэвид Шмитт
dnsmasq не может этого сделать.
DisplayName
Какая часть поведения, описанного в --address=разделе справочной страницы dnsmasq.conf, не охватывает сценарий использования, описанный выше?
Джеральд Комбс
11

Простой рабочий процесс (не нужно ничего устанавливать)

Мне лично нравится создавать PAC-файл для этого и заставлять мой браузер просто использовать его.

Шаг 1: создайте файл, например: *.proxy.pac*где-то (я использую свою $homeпапку)

Шаг 2: вставьте этот код (пример с портом 8000):

function FindProxyForURL(url, host) {
  if (shExpMatch(host, "*localhost")) {
    return "PROXY localhost:8000";
  }
  return "DIRECT";
}

Шаг 3 : Заставьте ваш браузер использовать этот файл PAC.

Youtube видео для PAC & Firefox

Шаг 4. Теперь вы можете протестировать свое приложение, открыв:http://mysubdomain.localhost/

Шаг 5: Наслаждайтесь :)

Биджан
источник
3
Возможно, стоит упомянуть, что это повлияет только на ваш браузер. Другие программы (например wget, не будут затронуты этим). Это само по себе не проблема, но, возможно, лучше упомянуть об этом.
Виллем Ван Онсем
Если вы пойдете по пути .pac и внедрите сервер node.js, вы будете удивлены, увидев, что req.urlтеперь это абсолютный URL. Это сделано потому, что предполагается, что вы хотите написать реальный прокси-сервер, но это удивительно, если вы пришли к этому методу просто как способ прекратить добавлять записи / etc / hosts для отладки. К твоему сведению те, кто может пойти по той же дороге, что и я.
Том Бутелл
5

Я привел в порядок старый мой проект:

https://github.com/airtonix/avahi-aliases

требования:

  • Linux, где устанавливаются avahi и python-avahi
  • у вас все в порядке с доменами .local (другие типы не поддерживаются)

Преимущества перед использованием dnsmasq или прокси-сервера python dns:

  • другие пользователи avahi / bonjour в вашей локальной сети могут разрешить создаваемые вами псевдонимы и объявить их в сети (при условии, что вы разрешаете доступ к порту 5353)
airtonix
источник
4

Это решение на основе DNS отлично работало в моем случае, без необходимости устанавливать что-либо: https://gist.github.com/fedir/04e60d679d5657d1f9f9aa10b3168282 (Mac OSX 10.9)

Федир РЫХТИК
источник
Такое удивительное решение для Mac OSX.
iDev247
Неработающая ссылка, обновите свою ссылку, свое решение или каким-то образом осудите этот ответ. Приветствия.
Эрик Ходонский
Готово (добавлена ​​резервная копия)
Федир РИХТИК,
3

Вы не можете использовать подстановочный знак в /etc/hosts.

Посмотрите здесь, чтобы узнать, как добиться успеха в OS X, используя BIND, встроенный, но неактивный DNS-сервер и Apache.

Тревор
источник
5
Apache не имеет ничего общего с поддоменами.
Аноним
3

Если вы хотите использовать dnsmasqс NetworkManagerвами, вы можете (или даже должны?) Начать dnsmasqс NetworkManagerдобавления

dns=dnsmasq

к /etc/NetworkManager/NetworkManager.conf. Затем конфиг dnsmasq переходит к /etc/NetworkManager/dnsmasq.confили /etc/NetworkManager/dnsmasq.d/соотв.

тротил
источник
2

Краткий ответ:

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

Маркос Плакона
источник
2
Что позволит вам указать номера портов? Не DNS AFAIK.
Птман
2

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

Для веб-хостинга (я никогда не видел его использовать иначе) это делается в DNS в сочетании с веб-сервером с поддержкой виртуального хостинга. Для получения дополнительной информации о DNS-записях с подстановочными знаками (Википедия) и статье хостинг с подстановочными знаками с помощью Apache и Bind для Linux с использованием bind и Apache.

В худшем случае вы могли бы использовать локальный DNS-сервер.

mctylr
источник
2

Обычной задачей для этой темы является сопоставление каталогов с поддоменами. Очень простой способ для этого - автоматически добавлять записи на основе каталога в файл hosts:

#! / USR / бен / питон

импорт ОС

hostsFile = open ("/ etc / hosts", "a +");

lines = hostsFile.readlines ()

для fileName в os.listdir ('/ opt / subdomainDirs'):

    entryExists = False
    для строки в строках:
        если fileName в строке:
            entryExists = True  

    если не entryExists:
        hostsFile.write ("127.0.0.1" + fileName + ".localhost \ n");
Лукас Глования
источник
2

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

файл hosts (добавить запись)

файл: / etc / hosts (не Windows)

127.0.0.1   example.local

Конфигурация httpd.conf (включить vhosts)

файл: /XAMPP/etc/httpd.conf

# Virtual hosts
Include etc/extra/httpd-vhosts.conf

Конфигурация httpd-vhosts.conf

файл: XAMPP / etc / extra / httpd-vhosts.conf

<VirtualHost *:80>
    ServerAdmin admin@example.local
    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:

сохранить как угодно. pac, где вы хотите, а затем загрузить файл в сеть браузера> прокси> настройки авто_конфигурации (перезагрузите, если вы измените это)

function FindProxyForURL(url, host) {
  if (shExpMatch(host, "*example.local")) {
    return "PROXY example.local";
  }
  return "DIRECT";
}
Даниэль Джорди
источник
2

У меня работал 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

jbangerter
источник
Это не будет работать, если ваш дистрибутив использует netplan (ubuntu 18.04, я смотрю на вас)
MrMesees