Platzhalter in einer Windows-Hosts-Datei


289

Ich möchte meinen lokalen Entwicklungscomputer so einrichten, dass alle Anforderungen an *.localumgeleitet werden localhost. Die Idee ist, dass ich beim Entwickeln mehrerer Sites einfach vhosts zu Apache hinzufügen kann, die aufgerufen werden site1.local, site2.localusw., und sie alle auflösen lassen localhost, während Apache eine andere Site entsprechend bedient.

Ich bin unter Windows XP.

Ich habe versucht hinzuzufügen

127.0.0.1       *.local

zu meiner c:\windows\system32\drivers\etc\hostsDatei, auch versucht:

127.0.0.1       .local

Beides scheint nicht zu funktionieren.

Ich weiß, dass ich sie auf verschiedenen Portnummern einrichten kann, aber das ist ein Schmerz, da es schwer ist, sich zu erinnern, welcher Port welcher ist.

Ich möchte keinen lokalen DNS-Server einrichten müssen oder irgendetwas Schwieriges, irgendwelche Vorschläge?


1
Bitte verwenden Sie anysubdomain.reconn.co.uk als Workaround (wenn Sie online sind), der immer auf Ihren lokalen Host verweist (siehe meine Antwort unten).
Paul Grimshaw

Was ist mit einem Skript, das den Servernamen des Apache-vhosts analysiert und die Hosts-Datei aktualisiert?
Elvis Ciotti

1
Ich glaube, * .local hat eine spezielle Semantik, und Sie sollten etwas verwenden, das nicht existiert. Ich benutze * .dev, da ich das nicht für echt halte.
WraithKenny

Antworten:


431

Acrylic DNS Proxy (kostenlos, Open Source) erledigt den Job. Es erstellt einen Proxy-DNS-Server (auf Ihrem eigenen Computer) mit einer eigenen Hosts-Datei. Die Hosts-Datei akzeptiert Platzhalter.

Download von der offiziellen Website

http://mayakron.altervista.org/support/browse.php?path=Acrylic&name=Home

Konfigurieren des Acryl-DNS-Proxys

Um den Acryl-DNS-Proxy zu konfigurieren, installieren Sie ihn über den obigen Link und gehen Sie dann zu:

  1. Anfang
  2. Programme
  3. Acryl-DNS-Proxy
  4. Konfig
  5. Benutzerdefinierte Hosts-Datei bearbeiten (AcrylicHosts.txt)

Fügen Sie die folgenden Zeilen am Ende der Datei hinzu:

127.0.0.1   *.localhost
127.0.0.1   *.local
127.0.0.1   *.lc

Starten Sie den Acrylic DNS Proxy-Dienst neu:

  1. Anfang
  2. Programme
  3. Acrilic DNS-Proxy
  4. Konfig
  5. Starten Sie den Acrylservice neu

Sie müssen auch Ihre DNS-Einstellung in den Einstellungen Ihrer Netzwerkschnittstelle anpassen:

  1. Anfang
  2. Schalttafel
  3. Netzwerk und Internet
  4. Netzwerkverbindungen
  5. Eigenschaften der LAN-Verbindung
  6. TCP / IPv4

Stellen Sie "Folgende DNS-Serveradresse verwenden" ein:

Preferred DNS Server: 127.0.0.1

Wenn Sie diese Antwort dann mit der Antwort von jeremyasnyder (mit VirtualDocumentRoot) kombinieren , können Sie automatisch Domänen / virtuelle Hosts einrichten, indem Sie einfach ein Verzeichnis erstellen.


12
Um klar zu sein, ist die "benutzerdefinierte Hosts-Datei" AcrylicHosts.txt, nicht AcrylicConfiguration.ini. Vielleicht sollte das offensichtlich sein, aber es hat mich eine Weile verwirrt.
Mhenry1384

@Petah - diese genaue Konfiguration funktionierte für mich mit Platzhalterdomänen, aber sie wurde einfach gestoppt und ich kann nicht herausfinden, warum. Alle Anfragen geben "Diese Seite ist nicht verfügbar" zurück. Acryllic neu gestartet, alle Caches zurückgesetzt ... was könnte es sonst noch sein?
SB2055

1
@ SB2055 Überprüfen Sie, ob Ihre DNS-Einstellungen in Ihren Netzwerkeigenschaften noch korrekt sind.
Petah

Es ist zu beachten, dass Acryl nicht für Situationen geeignet ist, in denen sich Ihre Netzwerkumgebung häufig ändert. Der öffentliche DNS-Server von Google löst keine echten Computernamen in Ihrem Netzwerk auf ... und Sie können dies für ein Netzwerk beheben, aber Sie können interne Computernamen immer noch nicht auflösen, wenn Sie in ein anderes Netzwerk wechseln. Dies kann besonders schmerzhaft sein. Ich sollte aber auch darauf hinweisen, dass ich nicht alles über Acryl weiß.
Alex Dresko

Wenn dies innerhalb einer VM erfolgt, sollte die PrimaryServerAddressin der Konfiguration (nicht in der Hosts-Datei) von der Standardeinstellung 8.8.8.8auf die vom Host bereitgestellte geändert werden . In VirtualBox ist dies 10.0.2.3.
Mightyiam

80

Um Ihre Frage zu beantworten, können Sie unter Windows keine Platzhalter in der Hosts-Datei verwenden.

Wenn Sie jedoch nur die Hosts-Datei ändern möchten, damit neue Websites funktionieren, können Sie Ihren Apache folgendermaßen konfigurieren und müssen die Konfiguration nicht weiter bearbeiten:

http://postpostmodern.com/instructional/a-smarter-mamp/

Fügen Sie Ihrer apache.conf-Datei im Grunde genommen eine kurze Zusammenfassung hinzu, die auf meinem Setup basiert:

 LoadModule vhost_alias_module modules/mod_vhost_alias.so

 NameVirtualHost *:80

  <Directory "/xampp/sites">
      Options Indexes FollowSymLinks Includes ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all 
  </Directory>

  <VirtualHost *:80>
      VirtualDocumentRoot c:/xampp/sites/%-1/%-2+/
  </VirtualHost>

Dadurch kann ich einen Eintrag hinzufügen wie:

127.0.0.1       test.dev

und machen Sie dann das Verzeichnis c: \ xampp \ sites \ dev \ test und platzieren Sie die erforderlichen Dateien dort und es funktioniert einfach.

Die andere Option besteht darin, <Directory>Tags in der Datei apache.conf zu verwenden und auf die Seiten von http: // localhost / project / zu verweisen .


Können Sie unter OSX Platzhalter verwenden?
cjm2671


30

Ich denke nicht, dass es möglich ist.

Sie müssen die Apache Virtualroot-Einträge ohnehin jedes Mal ändern, wenn Sie eine neue Site und einen neuen Speicherort hinzufügen. Daher ist es keine große Arbeit, den neuen Namen mit der Windows-vhost-Datei zu synchronisieren.

Update: Bitte überprüfen Sie die nächste Antwort und die Kommentare zu dieser Antwort. Diese Antwort ist 6 Jahre alt und nicht mehr korrekt.


3
Bei Verwendung von Nginx ist es jedoch nicht erforderlich, die Konfigurationsdatei von Nginx zu ändern, um eine neue Gruppe von Domänen der zweiten Ebene * .localhost hinzuzufügen. Es ist also das Minus der Hosts-Datei.
Sergzach

8
Nur um darauf hinzuweisen, dass Sie bei einer mehrsprachigen Website möglicherweise einen <VirtualHost> mit ServerAlias *.mydomain.localhost( *als Sprachcode) haben, sodass Sie httpd.conf nicht jedes Mal bearbeiten müssen, wenn Sie eine neue Sprache hinzufügen. Sie müssen die Subdomain jedoch noch zur Hosts-Datei hinzufügen, daher die Relevanz der obigen Frage.
Benjamin

10
Dynamische virtuelle Hosts sind hier das Schlüsselwort und werden von den meisten Servern, dh Apache und Nginx, unterstützt. Also nein, Sie müssen Ihre Apache-Konfiguration definitiv nicht jedes Mal berühren, wenn Sie ein Projekt erstellen.
Valentin Klinghammer

2
Wir können auch virtuelle Wildcard-Hosts haben, es liegt nur an der hostsDatei
ericn

6

Um bereits hier auf die großen Anregungen, XIP.IO ist ein fantastischer Wildcard - DNS - Server , die öffentlich zugänglich ist.

      myproject.127.0.0.1.xip.io  -- resolves to -->   127.0.0.1
  other.project.127.0.0.1.xip.io  -- resolves to -->   127.0.0.1
   other.machine.10.0.0.1.xip.io  -- resolves to -->   10.0.0.1

(Die Möglichkeit, Nicht-Loopback-Adressen anzugeben, eignet sich hervorragend zum Testen von Websites auf iOS-Geräten, auf die Sie nicht auf eine Hosts-Datei zugreifen können.)

Wenn Sie dies mit einigen der in anderen Antworten erwähnten Apache-Konfigurationen kombinieren, können Sie möglicherweise VirtualHosts ohne Setup hinzufügen .


Und es funktioniert für Ihre Teammitglieder im Falle einer IP in Ihrem LAN. Sie müssen keinen lokalen DNS-Server mit derselben Hosts-Datei installieren.
Tobias Uhmann

4

Ich habe einen Beitrag über die Verwendung der Windows-Hosts-Datei gefunden , in dem auch steht, dass keine Platzhalter zulässig sind.

In der Vergangenheit habe ich gerade die zusätzlichen Einträge zur Hosts-Datei hinzugefügt, da es (wie bereits erwähnt) nicht so viel zusätzliche Arbeit gibt, wenn Sie die Apache-Konfigurationsdatei bereits bearbeiten.


Je länger Sie die Hosts-Datei erstellen, desto länger dauert das Auflösen von Anforderungen. Keine gute Lösung, wenn Sie viele Einträge haben.
Cchamberlain

4

Das Bearbeiten der Hosts-Datei ist weniger schmerzhaft, wenn Sie "ipconfig / flushdns" an der Windows-Eingabeaufforderung ausführen, anstatt Ihren Computer neu zu starten.


1
Der DNS-Cache des Browsers wird nicht geleert, sondern der des Fensters. Er muss also 20 bis 30 Minuten warten, bis der Browser das DNS-Caching freigibt.
Jacob Melvad Jensen

3

Sie können Ihren Netzwerkadministrator überreden, eine Domain für Sie einzurichten (z. B. 'evilpuppetmaster.hell') und den Platzhalter dort zu haben, damit alles (* .evilpuppetmaster.hell ') in Ihre IP aufgelöst wird


1
Vielen Dank, aber dies ist auf einem Heim-Devserver. Es ist kein DNS- oder Netzwerkadministrator verfügbar.
EvilPuppetMaster

OK, vielleicht haben Sie Zugriff auf eine Domain oder kennen jemanden, der dies tut? ZB: * .evilpuppetmatser.arealdomain.com
Stu Thompson

Nicht wirklich. Trotzdem ist dies ein Heimcomputer, der jedes Mal eine neue IP erhält, wenn mein Router eine Verbindung zum Internet herstellt. Ein externer DNS-Server würde nicht helfen.
EvilPuppetMaster

1
1) Es gibt keinen Grund * .evilpuppetmatser.arealdomain.com kann nicht auf 127.0.0.1 aufgelöst werden. 2) Ich schlage keinen externen DNS-Server vor. Ich schlage vor, dass Sie eine Subdomain in einer realen Domain verwenden. Technisch kann jeder server.evp.arealdomain.com auflösen.
Stu Thompson

3
Es gibt auch einige öffentliche wie * .127.0.0.1.xip.io und andere
Dave James Miller

3

Wir haben diese Funktion mit Platzhalter-DNS in unserem lokalen DNS-Server: Fügen Sie einen AEintrag wie so etwas hinzu*.local -> 127.0.0.1

Ich denke, dass Ihre Netzwerkeinstellungen das ausgewählte Domänensuffix in der Suchliste für Domänensuffixe für Computer im Netzwerk haben müssen. Daher möchten Sie möglicherweise .localdie interne Domäne Ihres Unternehmens (z. B. .int) ersetzen und dann eine Unterdomäne hinzufügen .localhost.int, um dies zu verdeutlichen wofür es ist.

So *.localhost.intwürde lösen 127.0.0.1für alle Teilnehmer im Netzwerk und Konfigurationsdatei Einstellungen für alle Entwickler würde „nur Arbeit“ , wenn Endpunkte hängen von dieser Sub - Domain zB site1.localhost.int, site2.localhost.intDas ist so ziemlich das Schema wir eingeführt haben.

dnsmasq sieht auch gut aus, aber ich habe es noch nicht ausprobiert: http://ihaveabackup.net/2012/06/28/using-wildcards-in-the-hosts-file/



2

Sie können AngryHosts ausprobieren , mit dem Platzhalter und reguläre Ausdrücke unterstützt werden. Tatsächlich handelt es sich um eine Software zur Verbesserung und Verwaltung von Hostdateien.
Weitere Funktionen finden Sie unter http://angryhosts.com/features/


2

Ich benutze DNSChef, um das zu tun.

https://thesprawl.org/projects/dnschef/

Sie müssen die App herunterladen, unter Linux oder Mac benötigen Sie Python, um sie auszuführen. Windows hat eine eigene Exe.

Sie müssen beispielsweise eine INI-Datei mit Ihren DNS-Einträgen erstellen

[A]
*.google.com=192.0.2.1
*.local=127.0.0.1
*.devServer1.com=192.0.2.3

Anschließend müssen Sie die DNS-Anwendung mit Administratorrechten starten

sudo python dnschef.py --file myfile.ini -q

oder in Fenstern

runas dnschef.exe --file myfile.ini -q

Schließlich müssen Sie Ihre lokale Host-Umgebung (Netzwerk, Schnittstelle, DNS oder ähnliches oder unter Linux /etc/resolv.conf) als einziges DNS einrichten.

Das ist es


2

Ich habe dieses einfache Tool entwickelt, um den Platz von Hosts einzunehmen. Reguläre Ausdrücke werden unterstützt. https://github.com/stackia/DNSAgent

Eine Beispielkonfiguration:

[
    {
        "Pattern": "^.*$",
        "NameServer": "8.8.8.8"
    },
    {
        "Pattern": "^(.*\\.googlevideo\\.com)|((.*\\.)?(youtube|ytimg)\\.com)$",
        "Address": "203.66.168.119"
    },
    {
        "Pattern": "^.*\\.cn$",
        "NameServer": "114.114.114.114"
    },
    {
        "Pattern": "baidu.com$",
        "Address": "127.0.0.1"
    }
]

0

Ich konnte kein schriftliches Verbot finden, aber gemäß Konvention folgt die Windows-Hosts-Datei genau der UNIX-Hosts-Datei, und Sie können keine Platzhalter-Hostnamenreferenzen in diese Datei einfügen.

Wenn Sie die Manpage lesen, heißt es:

DESCRIPTION
     The hosts file contains information regarding the known hosts on the net-
     work.  For each host a single line should be present with the following
     information:

           Internet address
           Official host name
           Aliases

Obwohl es heißt,

     Host names may contain any printable character other than a field delim-
     iter, newline, or comment character.

das ist aus praktischer Sicht nicht wahr.

Grundsätzlich unterstützt der Code, der die Datei / etc / hosts durchsucht, keinen Platzhaltereintrag.

Die Problemumgehung besteht darin, alle Einträge im Voraus zu erstellen. Verwenden Sie möglicherweise ein Skript, um ein paar hundert Einträge gleichzeitig einzufügen.


0

@petah und Acryl DNS Proxy ist die beste Antwort, und am Ende verweist er auf die Möglichkeit, Multi-Site mit einem Apache zu tun, den @jeremyasnyder etwas weiter unten beschreibt ...

In unserem Fall testen wir jedoch ein Hosting-System mit mehreren Mandanten. Daher gehen die meisten Domains, die wir testen möchten, auf dasselbe System virtualhost, während einige andere auf andere Bereiche ausgerichtet sind.

In unserem Fall verwenden Sie also einfach Regex-Platzhalter in der ServerAliasDirektive, wie z.

ServerAlias *.foo.local

0

Hier ist die Gesamtkonfiguration für diejenigen, die versuchen, das Ziel zu erreichen (Platzhalter in der Entwicklungsumgebung, dh XAMPP - in diesem Beispiel wird davon ausgegangen, dass alle Sites auf dieselbe Codebasis verweisen).

Hosts-Datei (Eintrag hinzufügen)

Datei:% SystemRoot% \ system32 \ drivers \ etc \ hosts

127.0.0.1   example.local

httpd.conf Konfiguration (vhosts aktivieren)

Datei: \ XAMPP \ etc \ httpd.conf

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

httpd-vhosts.conf Konfiguration

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

Starten Sie Apache neu

Pac-Datei erstellen:

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

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

Hat nicht funktioniert, weiß noch nichts über PAC, aber diese Zeile 'return "PROXY example.local";' Würden Sie keinen Proxy-IP-Port zurückgeben, der vom Browser als Proxy verwendet werden soll?
Ionut

0

Sie können hierfür echoipdns verwenden ( https://github.com/zapty/echoipdns ).

Durch Ausführen werden echoipdns local alle Anforderungen für .local-Subdomänen auf 127.0.0.1 umgeleitet, sodass jede Domain mit xyz.local usw. in 127.0.0.1 aufgelöst wird. Sie können jedes andere Suffix verwenden und einfach local durch den gewünschten Namen ersetzen.

Echoipdns ist noch leistungsfähiger. Wenn Sie Ihre URL von anderen Computern im Netzwerk verwenden möchten, können Sie sie weiterhin ohne Konfiguration verwenden.

Wenn beispielsweise die IP-Adresse Ihres Computers 192.168.1.100 lautet, können Sie jetzt einen Domänennamen xyz.192-168-1-100.local verwenden, der immer in 192.168.1.100 aufgelöst wird. Diese Magie wird von den echoipdns ausgeführt, indem die IP-Adresse im zweiten Teil des Domainnamens überprüft und dieselbe IP-Adresse bei der DNS-Abfrage zurückgegeben wird. Sie müssen die echoipdns auf dem Computer ausführen, von dem aus Sie auf das Remote-System zugreifen möchten.

echoipdns kann auch als eigenständiger DNS-Proxy eingerichtet werden. Wenn Sie also nur auf diesen DNS verweisen, können Sie jetzt alle oben genannten Vorteile nutzen, ohne jedes Mal einen speziellen Befehl ausführen zu müssen, und Sie können ihn sogar von Mobilgeräten aus verwenden.

Dies vereinfacht im Wesentlichen die auf Wildcard-Domänen basierende DNS-Entwicklung sowohl für die lokale als auch für die Teamumgebung.

echoipdns funktioniert unter Mac, Linux und Windows.

HINWEIS: Ich bin Autor für echoipdns.


0

Konfiguration für die automatische Subdomain nginx config mit Acrylic DNS Proxy

auto.conf-Datei für Ihren Nginx-Sites-Ordner

server {
    listen 80;
    server_name ~^(?<branch>.*)\.example\.com;
    root /var/www/html/$branch/public;  

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_log  /var/log/nginx/$branch.error.log error;

    sendfile off;

    client_max_body_size 100m;

    location ~ \.php$ {
       try_files $uri /index.php =404;
       fastcgi_pass php-fpm:9000;
       fastcgi_index index.php;
       fastcgi_buffers 16 16k;
       fastcgi_buffer_size 32k;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

Zur Acrylic-Hosts-Datei 127.0.0.1 example.com *.example.comhinzufügen und Acrylic-Dienst neu starten. $ branch - Ihr Subdomainname.

Set anstelle von root / var / www / html / $ branch / public; Ihr Projektpfad


0

Dies kann mit Pi-Hole erfolgen . Bearbeiten Sie einfach "/ etc / hosts" und starten Sie den DNS-Dienst neu.

nano /etc/hosts
pihole restartdns

Beispiel:

127.0.1.1       raspberrypi
192.168.1.1     w1.dev.net
192.168.1.2     w2.dev.net
192.168.1.3     w3.dev.net

-1

Sie können einen dynamischen DNS-Client wie http://www.no-ip.com verwenden . Dann mit einem externen DNS-Server CNAME * .mydomain.com zu mydomain.no-ip.com.


2
das würde zu Ihrer externen IP aufgelöst, und normalerweise würde das nur Ihre Router / Modems-Konfigurationsseite aufrufen
Sam

-1

Während Sie einen solchen Platzhalter nicht hinzufügen können, können Sie die vollständige Liste der Websites, die Sie benötigen, zumindest zum Testen, hinzufügen, die für mich gut genug funktioniert. Fügen Sie in Ihrer Hosts-Datei einfach Folgendes hinzu:

127.0.0.1 site1.local
127.0.0.1 site2.local
127.0.0.1 site3.local
...


Ich denke, das Originalplakat versucht, den Aufwand dieses Schritts zu vermeiden.
Simon East
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.