W jaki sposób mogę zrobić subdomenę w pliku / etc / hosts / w systemie Linux / OSX?


168

Muszę przetestować subdomeny na moim hoście lokalnym. Jak mogę skutecznie uzyskać ten wynik dodania *.localhost.comdo mojego /etc/hosts/pliku?

Jeśli nie jest to możliwe, jak obejść ten problem? Muszę przetestować subdomeny z symbolami zastępczymi na moim serwerze lokalnym. Jest to serwer Django, czy serwer Django może obsługiwać subdomeny? Czy jakieś inne oprogramowanie / routing może dać oczekiwany przeze mnie wynik końcowy?


1
Należy do administratora?
Paul R

Wiem, że ludzie mówią, że to niemożliwe! Ale jak mam to zrobić! Czegoś poza / etc / hosts / mogę użyć, aby uzyskać efekt. Testuję serwer programistyczny.
MikeN


Ponieważ większość odpowiedzi koncentruje się na twoim pierwszym pytaniu (symbole wieloznaczne poddomeny localhost), odpowiem na twoje drugie pytanie jako komentarz: tak, serwer deweloperski Django jest w pełni zdolny do obsługi poddomen lokalnych localhost, wystarczy przekonać swoją przeglądarkę i system operacyjny aby wysłać ruch po swojemu (korzystając z jednego z poniższych rozwiązań)!
hheimbuerger

Odpowiedzi:


43

Napisałem proxy dns w Pythonie. Czyta wpisy symboli wieloznacznych w / etc / hosts. Zobacz tutaj: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py


To jest doskonałe! Długo szukałem takiego prostego rozwiązania (Praca na OSX Mavericks BTW)
Billy Moon

2
teraz, gdybyśmy tylko mogli to pip installzrobić :)
metakermit

1
Zainstalowałem to, zrobiłem wszystko i uruchomiłem, ale nie blokuje stron.
DisplayName,

Nie mogę głosować za tym wystarczająco. Potrzebowałem tego na zawsze, natknąłem się na ten klejnot pytania i odpowiedzi, i jestem trochę hakerem Pythona, i to jest fajny smakołyk. Dzięki za udostępnienie!
Farley,

152

Zainstaluj dnsmasq (i tak robię to na wszystkich komputerach z systemem Linux jako pamięć podręczna DNS). W dnsmasq.confdodać linię:

address=/localhost.com/127.0.0.1

7
Znakomity! Uwaga dla użytkowników komputerów Mac: to naprawdę jest takie proste: 1. sudo port install dnsmasq2. edycja /opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
tomc

17
OSX z naparem: tak samo jak powyżej, ale napar instaluje dnsmasq
Matt Humphrey

1
fyi brew> port (ponownie sugestia @MattHumphrey)
electblake

1
Ten przykład nie działa dla mnie, prawdopodobnie dlatego, że używam vagrantup.com do lokalnego udostępniania . Nie martw się, już zmieniłem adres IP na prawidłowy, 192.168.50.11ale DNS nie rozwiązuje problemu. Wszelkie pomysły, czy ten przykład jest poprawny dla adresów IP „nie 127.0.0.1”?
Brian

6
Świetna wskazówka. W przypadku pulpitu Ubuntu 14.04 (który domyślnie uruchamia dnsmasq), utwórz plik o nazwie /etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.confi umieść w nim linię address=/localhost.com/127.0.0.1, a następnie uruchom ponownie.
user38397,

60

W /etc/hostspliku nie można podać symboli wieloznacznych . Podaj jawnie wymagane nazwy hostów lub alternatywnie skonfiguruj lokalny serwer nazw z odpowiednimi regułami.


15

Musisz skonfigurować serwer DNS i pozwolić każdemu klientowi używać go do rozwiązywania problemów. Sam serwer może być czymś tak „lekkim” jak dnsmasq lub tak ciężkim jak BIND .


+1 za dnsmasq, który jest naprawdę dobrze udokumentowany i łatwy w użyciu
David Schmitt

dnsmasq nie jest w stanie tego zrobić.
DisplayName

Jaka część zachowania opisanego w --address=sekcji strony podręcznika dnsmasq.conf nie obejmuje opisanego powyżej przypadku użycia?
Gerald Combs,

11

Prosty przepływ pracy (nie trzeba niczego instalować)

Osobiście lubię do tego tworzyć plik PAC i sprawić, że moja przeglądarka po prostu go używa.

Krok 1: Utwórz plik, np .: *.proxy.pac*gdzieś (używam mojego $homefolderu)

Krok 2: wklej ten kod (przykład dotyczy portu 8000):

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

Krok 3 : Spraw, aby Twoja przeglądarka używała tego pliku PAC.

Youtube Video dla PAC i Firefox

Krok 4 : Teraz możesz przetestować aplikację, uzyskując dostęp do:http://mysubdomain.localhost/

Krok 5: Ciesz się :)


3
Być może warto wspomnieć, że wpłynie to tylko na twoją przeglądarkę. Inne programy (na przykład wgetnie zostaną dotknięte przez to). Nie stanowi to problemu per se, ale może lepiej o tym wspomnieć.
Willem Van Onsem

Jeśli wybierzesz trasę .pac i zaimplementujesz serwer node.js, zdziwisz się, widząc, że req.urljest to teraz bezwzględny adres URL. Dzieje się tak, ponieważ założono, że chcesz napisać rzeczywisty serwer proxy, ale zaskakujące jest, jeśli przyszedłeś do tej techniki jako sposób na zaprzestanie dodawania wpisów / etc / hosts w celu debugowania. Dla tych, którzy mogliby pójść tą samą drogą, którą zrobiłem.
Tom Boutell

5

Uporządkowałem mój stary projekt:

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

wymagania:

  • Linux, gdzie można zainstalować avahi i python-avahi
  • nie masz nic przeciwko domenom .local (avahi nie obsługuje żadnego innego rodzaju)

Zalety w stosunku do używania dnsmasq lub proxy dns python:

  • inni użytkownicy avahi / bonjour w Twojej sieci lokalnej mogą rozpoznać utworzone przez siebie aliasy i ogłosić je w sieci (pod warunkiem, że zezwalasz na dostęp do portu 5353)


3

Nie możesz użyć znaku wieloznacznego w /etc/hosts.

Rzucić okiem tutaj dobrego instruktażu, w jaki sposób osiągnąć na OS X za pomocą BIND, wbudowany ale nieaktywny serwer DNS i Apache.


5
Apache nie ma nic wspólnego z poddomenami.
Anonimowy

3

Jeśli chcesz używać dnsmasqz NetworkManagerTobą, możesz (a nawet musisz?) Zacząć dnsmasqod NetworkManagerdodania

dns=dnsmasq

do /etc/NetworkManager/NetworkManager.conf. Następnie konfiguracja dnsmasq idzie do /etc/NetworkManager/dnsmasq.conflub /etc/NetworkManager/dnsmasq.d/resp.


2

Krótka odpowiedź:

Twój plik / etc / hosts / nie pozwoli ci używać symboli wieloznacznych ani numerów portów. Musisz utworzyć jeden wpis dla każdej subdomeny


2
Co pozwoliłoby ci określić numery portów? Nie DNS AFAIK.
ptman

2

Krótka odpowiedź brzmi: nie. Dłuższą odpowiedzią jest to, że musisz jaśniej określić, co naprawdę chcesz osiągnąć, ponieważ może istnieje albo lepszy sposób, albo inny sposób na osiągnięcie tego.

W przypadku hostingu internetowego (nigdy nie widziałem, aby był używany inaczej) odbywa się w DNS w połączeniu z wirtualnym serwerem hostingowym. Aby uzyskać więcej informacji na temat rekordów DNS z symbolami wieloznacznymi (Wikipedia) oraz artykuł Hosting symboli wieloznacznych za pomocą Apache i Bind dla systemu Linux za pomocą bind i Apache.

W najgorszym przypadku można użyć lokalnego serwera DNS.


2

Typowym zadaniem tego tematu jest mapowanie katalogów do poddomen. Bardzo prostym sposobem na to jest automatyczne dodanie wpisów opartych na katalogu do pliku hosts:

#! / usr / bin / python

import os

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

linie = hostsFile.readlines ()

dla fileName w os.listdir ('/ opt / subdomainDirs'):

    entryExists = False
    dla linii w liniach:
        jeśli nazwa pliku w linii:
            entryExists = True  

    jeśli nie wpis Występuje:
        hostsFile.write („127.0.0.1” + nazwa_pliku + „.localhost \ n”);

2

Dziękuję tschundeee za to, co uważam za ostateczną odpowiedź na ten problem, chciałbym po prostu skomentować, ale tutaj jest całkowita konfiguracja dla tych, którzy próbują osiągnąć pierwotny cel (symbole wieloznaczne wskazują na tę samą bazę kodów - nic nie instaluj, środowisko deweloperskie, tj. , XAMPP)

plik hosts (dodaj wpis)

plik: / etc / hosts (nie Windows)

127.0.0.1   example.local

Konfiguracja httpd.conf (włącz vhosts)

plik: /XAMPP/etc/httpd.conf

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

Konfiguracja httpd-vhosts.conf

plik: 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>

uruchom ponownie apache

utwórz plik pac:

zapisz jako cokolwiek.pac gdziekolwiek chcesz, a następnie załaduj plik do sieci przeglądarki> proxy> ustawienia auto_konfiguracji (załaduj ponownie, jeśli to zmienisz)

function FindProxyForURL(url, host) {
  if (shExpMatch(host, "*example.local")) {
    return "PROXY example.local";
  }
  return "DIRECT";
}

2

dnsmasq pracował dla mnie, tyle że musiałem zrobić kilka dodatkowych kroków.

Oto pełna procedura:

  1. Przygotuj /etc/resolv.confz następującym wierszem

    nameserver 127.0.0.1
    
  2. Dodaj następujące wiersze do /etc/dnsmasq.conf

    listen-address=127.0.0.1
    address=/localhost.localdomain/127.0.0.1
    address=/localhost/127.0.0.1
    
  3. Uruchom ponownie dnsmasq


To nie zadziała, jeśli twoja dystrybucja używa netplanu (ubuntu 18.04 Patrzę na ciebie)
MrMesees
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.