Wie kann ich in meiner / etc / hosts / -Datei unter Linux / OSX eine Wildcard-Unterdomäne erstellen?

169

Ich muss Sub-Domains auf meinem Localhost testen. Wie kann ich dieses Ergebnis effektiv *.localhost.comzu meiner /etc/hosts/Datei hinzufügen ?

Wie kann ich dieses Problem umgehen, wenn dies nicht möglich ist? Ich muss Wildcard-Subdomains auf meinem lokalen Server testen. Es ist ein Django-Devserver. Kann der Django-Devserver die Subdomains verwalten? Kann mir eine andere Software / Routing-Software das gewünschte Endergebnis liefern?

MikeN
quelle
1
Gehört zu Superuser?
Paul R
Ich weiß, dass Leute sagen, dass es nicht möglich ist! Aber wie mache ich das überhaupt! Was ist etwas außerhalb von / etc / hosts / kann ich verwenden, um den Effekt zu bekommen. Ich teste einen Entwicklungsserver.
MikeN
on superuser
Ciro Santilli
Da sich die meisten Antworten auf Ihre erste Frage konzentrieren (localhost-Subdomain-Platzhalter), beantworte ich Ihre zweite Frage als Kommentar: Ja, der Django-Dev-Server ist perfekt in der Lage, localhost-Subdomains zu verarbeiten. Sie müssen lediglich Ihren Browser und Ihr Betriebssystem überzeugen um den Verkehr zu leiten (mit einer der verschiedenen Lösungen unten)!
Hheimbuerger

Antworten:

43

Ich habe einen DNS-Proxy in Python geschrieben. Es werden Platzhaltereinträge in / etc / hosts gelesen. Siehe hier: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py

marlonyao
quelle
Dies ist perfekt! Ich habe lange nach einer einfachen Lösung wie dieser gesucht (Arbeiten an OSX Mavericks BTW)
Billy Moon
2
Nun, wenn wir es nur könnten pip install:)
Metakermit
1
Ich habe dies installiert, alles getan und ausgeführt, aber es blockiert keine Websites.
Display
Kann das nicht genug unterstützen. Ich habe das für immer gebraucht, bin auf dieses Juwel von Frage und Antwort gestoßen und bin ein bisschen ein Python-Hacker, und das ist ein ordentlicher Leckerbissen. Danke für das Teilen!
Farley
152

Installieren Sie dnsmasq (das mache ich auf allen meinen Linux-Desktops sowieso als DNS-Cache). In dnsmasq.confdie Zeile:

address=/localhost.com/127.0.0.1
tomchuk
quelle
7
Brillant! Hinweis für Mac-Benutzer, es ist wirklich so einfach: 1. sudo port install dnsmasq2. Bearbeiten /opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
Tomc
17
OSX mit Brew: Wie oben, aber Brew installiert dnsmasq
Matt Humphrey,
1
fyi brew> port (re @MattHumphrey Vorschlag)
Electblake
1
Dieses Beispiel funktioniert bei mir nicht, möglicherweise, weil ich vagrantup.com für das lokale Serving verwende. Keine Sorge, ich habe die IP bereits auf die richtige geändert, 192.168.50.11aber DNS wird nicht aufgelöst. Irgendwelche Ideen, ist dieses Beispiel für "Nicht-127.0.0.1" -IPs korrekt?
Brian
6
Toller Tipp. Erstellen Sie für einen Ubuntu 14.04-Desktop (auf dem standardmäßig dnsmasq ausgeführt wird) eine Datei mit dem Namen /etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.confund fügen Sie die Zeile address=/localhost.com/127.0.0.1ein, und starten Sie den Computer neu.
User38397
60

Es ist nicht möglich, Platzhalter in der /etc/hostsDatei anzugeben . Geben Sie entweder die erforderlichen Hostnamen explizit an oder richten Sie alternativ einen lokalen Nameserver mit den entsprechenden Regeln ein.

ar.
quelle
15

Sie müssen einen DNS-Server einrichten und von jedem Client zur Lösung verwenden lassen. Der Server selbst kann so "leicht" wie dnsmasq oder so schwer wie BIND sein .

Gerald Combs
quelle
+1 für dnsmasq, die wirklich gut dokumentiert und einfach zu bedienen ist
David Schmitt
dnsmasq ist dazu nicht in der Lage.
DisplayName
Welcher Teil des im --address=Abschnitt der Manpage dnsmasq.conf beschriebenen Verhaltens deckt den oben beschriebenen Anwendungsfall nicht ab?
Gerald Combs
11

Einfacher Workflow (keine Installation erforderlich)

Ich persönlich erstelle dafür gerne eine PAC-Datei und lasse meinen Browser sie einfach verwenden.

Schritt 1: erstelle eine Datei zB: *.proxy.pac*irgendwo (ich benutze meinen $homeOrdner)

Schritt 2: Fügen Sie diesen Code ein (Beispiel ist mit Port 8000):

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

Schritt 3 : Lassen Sie Ihren Browser diese PAC-Datei verwenden.

Youtube Video für PAC & Firefox

Schritt 4 : Jetzt können Sie Ihre App testen, indem Sie auf Folgendes zugreifen:http://mysubdomain.localhost/

Schritt 5: Viel Spaß :)

Bijan
quelle
3
Vielleicht ist es erwähnenswert, dass dies nur Ihren Browser betrifft. Andere Programme (wie wget, bleiben davon unberührt). Das ist an sich kein Problem, aber vielleicht ist es besser, dies zu erwähnen.
Willem Van Onsem
Wenn Sie sich für die .pac-Route entscheiden und einen node.js-Server implementieren, werden Sie überrascht sein, dass dies req.urlnun eine absolute URL ist. Dies geschieht, weil davon ausgegangen wird, dass Sie einen tatsächlichen Proxyserver schreiben möchten. Es ist jedoch überraschend, wenn Sie diese Technik gewählt haben, um das Hinzufügen von / etc / hosts-Einträgen zum Debuggen zu stoppen. Zu Ihrer Information an diejenigen, die vielleicht den gleichen Weg gehen wie ich.
Tom Boutell
5

Ich habe ein altes Projekt von mir aufgeräumt:

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

Anforderungen:

  • Linux, unter dem Avahi und Python-Avahi installiert werden können
  • Du bist mit .local-Domains einverstanden (Avahi unterstützt keine anderen Domains)

Vorteile gegenüber der Verwendung von dnsmasq oder dem Python-DNS-Proxy:

  • Andere Benutzer von avahi / bonjour in Ihrem lokalen Netzwerk können die von Ihnen erstellten Aliase auflösen und dem Netzwerk mitteilen (vorausgesetzt, Sie gestatten den Zugriff auf Port 5353).
Airtonix
quelle
4

Diese auf DNS basierende Lösung funktionierte in meinem Fall perfekt, ohne dass etwas installiert werden musste: https://gist.github.com/fedir/04e60d679d5657d1f9f9aa10b3168282 (Mac OSX 10.9)

Fedir RYKHTIK
quelle
Eine solch erstaunliche Lösung für Mac OSX.
iDev247
Toter Link, bitte aktualisieren Sie Ihren Link, Ihre Lösung oder lehnen Sie diese Antwort in irgendeiner Weise ab. Prost.
Eric Hodonsky
Fertig (Sicherung hinzugefügt)
Fedir RYKHTIK
3

In können Sie keine Platzhalter verwenden /etc/hosts.

Sehen Sie sich hier eine gute exemplarische Vorgehensweise für OS X mit BIND, dem integrierten, aber inaktiven DNS-Server und Apache an.

Trevor
quelle
5
Apache hat nichts mit Subdomains zu tun.
Anonym
3

Wenn Sie verwenden möchten , dnsmasqmit NetworkManagerIhnen kann (oder sogar müssen?) Starten dnsmasqvon NetworkManagerdurch Zugabe von

dns=dnsmasq

zu /etc/NetworkManager/NetworkManager.conf. Dann geht die dnsmasq-Konfiguration zu /etc/NetworkManager/dnsmasq.confoder /etc/NetworkManager/dnsmasq.d/resp.

TNT
quelle
2

Kurze Antwort:

In Ihrer Datei / etc / hosts / können Sie keine Platzhalter oder Portnummern verwenden. Sie müssen einen Eintrag für jede Ihrer Unterdomänen erstellen

Marcos Placona
quelle
2
Wie können Sie Portnummern angeben? Nicht DNS AFAIK.
ptman
2

Die kurze Antwort ist, dass Sie es nicht tun. Die längere Antwort lautet, dass Sie klarer definieren müssen, was Sie tatsächlich erreichen möchten, da es möglicherweise einen besseren und einen anderen Weg gibt, dies zu erreichen.

Für das Webhosting (ich habe noch nie gesehen, dass es anderweitig verwendet wird) wird DNS in Kombination mit einem Web-Server verwendet, der das virtuelle Hosting unterstützt. Weitere Informationen zu Wildcard-DNS-Einträgen (Wikipedia) sowie einen Artikel zum Hosting von Wildcards mit Apache und Bind für Linux mit bind und Apache.

Im schlimmsten Fall könnten Sie einen lokalen DNS-Server verwenden, nehme ich an.

mctylr
quelle
2

Eine häufige Aufgabe für dieses Thema ist die Zuordnung von Verzeichnissen zu Unterdomänen. Eine sehr einfache Möglichkeit besteht darin, die verzeichnisbasierten Einträge automatisch an die hosts-Datei anzuhängen:

#! / usr / bin / python

import os

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

lines = hostsFile.readlines ()

für Dateiname in os.listdir ('/ opt / subdomainDirs'):

    entryExists = False
    für Linie in Linien:
        wenn Dateiname in Zeile:
            entryExists = True  

    wenn nicht entryExists:
        hostsFile.write ("127.0.0.1" + fileName + ".localhost \ n");
Lukas Glowania
quelle
2

Vielen Dank, tschundeee, für die meiner Meinung nach ultimative Antwort auf dieses Problem. Ich wünschte, ich könnte nur einen Kommentar abgeben, aber hier ist die Gesamtkonfiguration für diejenigen, die versuchen, das ursprüngliche Ziel zu erreichen , XAMPP)

hosts-Datei (einen Eintrag hinzufügen)

Datei: / etc / hosts (nicht Windows)

127.0.0.1   example.local

httpd.conf Konfiguration (aktiviere vhosts)

Datei: /XAMPP/etc/httpd.conf

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

Konfiguration von httpd-vhosts.conf

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

starte Apache neu

pac Datei erstellen:

Speichern Sie die Datei als whatever.pac, wo immer Sie möchten, und laden Sie sie dann im Netzwerk des Browsers> Proxy> Auto_Configuration-Einstellungen (laden Sie sie neu, wenn Sie dies ändern).

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

dnsmasq funktionierte für mich, außer dass ich einige zusätzliche Schritte machen musste.

Hier ist die vollständige Prozedur:

  1. Stellen Sie /etc/resolv.confdie folgende Zeile voran

    nameserver 127.0.0.1
    
  2. Fügen Sie die folgenden Zeilen hinzu /etc/dnsmasq.conf

    listen-address=127.0.0.1
    address=/localhost.localdomain/127.0.0.1
    address=/localhost/127.0.0.1
    
  3. Starten Sie dnsmasq neu

jbangerter
quelle
Dies funktioniert nicht, wenn Ihre Distribution Netplan verwendet (Ubuntu 18.04 Ich sehe dich an)
MrMesees