Як у моєму / etc / hosts / файлі в Linux / OSX, як зробити піддомен wildcard?


169

Мені потрібно протестувати піддомени на своєму localhost. Як я можу ефективно отримати цей результат додавання *.localhost.comдо мого /etc/hosts/файлу?

Якщо це неможливо, як мені вирішити цю проблему? Мені потрібно перевірити піддомени wildcard на своєму локальному сервері. Це розробник Django, чи може сервер розробників Django обробляти піддомени? Чи може якась інша частина програмного забезпечення / маршрутизації дати мені кінцевий результат, який я хочу?


1
Належить до суперпользователя?
Пол Р.

Я знаю, люди кажуть, що це неможливо! Але як я це все роблю! Що є щось поза / etc / hosts / я можу використати для отримання ефекту. Я тестую сервер розробки.
MikeN


Оскільки більшість відповідей зосереджуються на вашому першому запитанні (підстановки піддомену localhost), я відповім на ваше вторинне запитання як коментар: так, сервер розробників Django цілком здатний обробляти піддомени localhost, вам просто потрібно переконати браузер і вашу ОС. відправити трафік своїм шляхом (використовуючи одне з різних рішень нижче)!
hheimbuerger

Відповіді:


43

Я написав dns-проксі в Python. Він буде читати записи підстановки в / etc / hosts. Дивіться тут: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py


Це прекрасно! Я довго шукав таке просте рішення (працюю над OSX Mavericks BTW)
Біллі Мун

2
тепер, якби ми могли тільки тільки pip installце :)
metakermit

1
Я встановив це, зробив усе і запустив це, але це не блокує сайти.
DisplayName

Не можете цього підкріпити. Мені це потрібно було назавжди, натрапив на цей дорогоцінний камінь запитання та відповіді, і я трохи хакер Python, і це акуратний примхливість. Дякую, що поділились!
Фарлі

152

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

address=/localhost.com/127.0.0.1

7
Блискуче! Примітка для користувачів Mac, це дійсно так просто: 1. sudo port install dnsmasq2. редагувати /opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
tomc

17
OSX з варінням: те саме, що вище, але заварюйте встановити dnsmasq
Метт Хамфрі

1
fyi brew> port (повторно @MattHumphrey пропозиція)
electblake

1
Цей приклад для мене не працює, можливо, тому що я використовую vagrantup.com для локальної подачі. Не хвилюйтеся, я вже змінив IP на правильний, 192.168.50.11але DNS не вирішує. Будь-які ідеї, чи правильний цей приклад для IP-адрес, що не стосуються 127.0.0.1?
Брайан

6
Чудова порада. Для робочого столу Ubuntu 14.04 (який запускає dnsmasq за замовчуванням), створіть файл, який називається, /etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.confі address=/localhost.com/127.0.0.1введіть у нього рядок , після чого перезапустіть.
користувач38397

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 Video for PAC & Firefox

Крок 4 : Тепер ви можете протестувати свою програму, відвідавши:http://mysubdomain.localhost/

Крок 5: Насолоджуйтесь :)


3
Можливо, варто згадати, що це вплине лише на ваш браузер. Інші програми (наприклад wget, цим не зачіпатимуться). Це само по собі не є проблемою, але, можливо, краще це згадати.
Віллем Ван Онсем

Якщо ви підете .pac маршрутом та реалізуєте сервер node.js, ви здивуєтеся, побачивши, що req.urlце тепер абсолютна URL-адреса. Це робиться тому, що припущення полягає в тому, що ви хочете написати фактичний проксі-сервер, але це дивно, якщо ви прийшли до цієї методики просто як спосіб зупинити додавання записів / etc / hosts для налагодження. FYI тим, хто може піти тією ж дорогою, що і я.
Том Бутел

5

Я налагодив старий проект свого шахти:

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

вимоги:

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

Переваги над використанням dnsmasq або проксі-серверу python dns:

  • інші користувачі avahi / bonjour у вашій локальній мережі можуть вирішити створені вами псевдоніми та оголосити в мережі (за умови, що ви дозволяєте отримати доступ до порту 5353)

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-записів (Вікіпедія) та статтю Wildcard, що розміщує Apache і Bind для Linux, використовуючи bind та Apache.

У гіршому випадку, ви можете використовувати локальний DNS-сервер.


2

Загальне завдання для цього предмета - зіставити каталоги на піддомени. Дуже простий спосіб для цього - автоматичне додавання записів на основі каталогу до файлу хостів:

#! / usr / bin / python

import os

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

лінії = hostsFile.readlines ()

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

    entryExists = Неправдиво
    для рядка в рядках:
        якщо рядок fileName:
            entryExists = Істинно  

    якщо немає entryExists:
        hostsFile.write ("127.0.0.1" + fileName + ".localhost \ n");

2

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

файл хостів (додайте запис)

файл: / 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>

перезапустити апаш

створити 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


Це не спрацює, якщо ваш дистрибутив використовує netplan (ubuntu 18.04, я дивлюся на вас)
MrMesees
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.