Comment puis-je créer un sous-domaine générique dans mon fichier / etc / hosts / sous Linux / OSX?

170

J'ai besoin de tester des sous-domaines sur mon hôte local. Comment puis-je effectivement avoir ce résultat d'ajouter *.localhost.comà mon /etc/hosts/fichier?

Si ce n'est pas possible, comment puis-je contourner ce problème? Je dois tester des sous-domaines génériques sur mon serveur local. Il s’agit d’un développeur Django, le serveur de développement Django peut-il gérer les sous-domaines? Un autre logiciel / routage peut-il me donner le résultat final souhaité?

MikeN
la source
1
Appartient au superutilisateur?
Paul R
Je sais que les gens disent que ce n'est pas possible! Mais comment je le fais quand même! Quelque chose est en dehors de / etc / hosts / je peux utiliser pour obtenir l'effet. Je teste un serveur de développement.
MikeN
sur super - utilisateur: unix.stackexchange.com/questions/3352/...
Ciro Santilli新疆改造中心法轮功六四事件
Comme la plupart des réponses se concentrent sur votre première question (caractères génériques de sous-domaine localhost), je répondrai sous forme de commentaire à votre question secondaire: oui, le serveur de développement Django est parfaitement capable de gérer les sous-domaines localhost, il vous suffit de convaincre votre navigateur et votre système d'exploitation. envoyer le trafic (en utilisant l’une des solutions ci-dessous)!
hheimbuerger

Réponses:

44

J'ai écrit un proxy DNS en Python. Il lira les entrées génériques dans / etc / hosts. Voir ici: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py

Marlonyao
la source
C'est parfait! Je recherche une solution simple comme celle-ci depuis longtemps (travail sur OSX Mavericks BTW)
Billy Moon
2
maintenant, si seulement nous pouvions le faire pip install:)
metakermit
1
J'ai installé ceci, j'ai tout fait et je l'ai exécuté, mais cela ne bloque pas les sites.
DisplayName
Ne peut pas upvote cela assez. J'ai besoin de ça pour toujours, je suis tombé sur ce petit bijou de question et de réponse, et je suis un peu un pirate informatique de Python, et ceci est un détail intéressant. Merci d'avoir partagé!
Farley
153

Installez dnsmasq (je le fais de toute façon sur tous mes bureaux Linux en tant que cache DNS). En dnsmasq.confplus la ligne:

address=/localhost.com/127.0.0.1
tomchuk
la source
7
Brillant! Note pour les utilisateurs de Mac, c’est vraiment simple: 1. sudo port install dnsmasq2. éditer /opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
tomc
17
OSX avec brassage: idem que ci-dessus mais installez brass
Matt Humphrey
1
Pour la première fois> port (suggestion de @MattHumphrey)
Electblake
1
Cet exemple ne fonctionne pas pour moi, probablement parce que j'utilise vagrantup.com pour la distribution locale. Ne vous inquiétez pas, j'ai déjà changé l'adresse IP, 192.168.50.11mais le DNS ne résout pas. Des idées, cet exemple est-il correct pour les adresses IP "non-127.0.0.1"?
Brian
6
Excellent conseil. Pour un poste de travail Ubuntu 14.04 (qui exécute dnsmasq par défaut), créez un fichier appelé /etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.conf, insérez-y la ligne address=/localhost.com/127.0.0.1, puis redémarrez-le.
user38397
60

Il n'est pas possible de spécifier des caractères génériques dans le /etc/hostsfichier. Spécifiez explicitement les noms d’hôte requis ou configurez un serveur de noms local avec les règles appropriées.

ar.
la source
15

Vous devez configurer un serveur DNS et demander à chaque client de l' utiliser pour la résolution. Le serveur lui-même peut être aussi "léger" que Dnsmasq ou aussi lourd que BIND .

Gérald Combs
la source
+1 pour dnsmasq, très bien documenté et facile à utiliser
David Schmitt
Dnsmasq n'est pas capable de faire cela.
DisplayName
Quelle partie du comportement décrit dans la --address=section de la page de manuel dnsmasq.conf ne couvre pas le cas d'utilisation décrit ci-dessus?
Gerald Combs
11

Flux de travail simple (pas besoin d'installer quoi que ce soit)

Personnellement, j'aime bien créer un fichier PAC pour cela et obliger mon navigateur à l'utiliser.

Étape 1: créer un fichier, par exemple: *.proxy.pac*quelque part (j'utilise mon $homedossier)

Étape 2: collez ce code (exemple, avec le port 8000):

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

Étape 3 : Faites en sorte que votre navigateur utilise ce fichier PAC.

Vidéo Youtube pour PAC et Firefox

Étape 4 : Vous pouvez maintenant tester votre application en accédant à:http://mysubdomain.localhost/

Étape 5: Profitez :)

Bijan
la source
3
Il convient peut-être de mentionner que cela n’affectera que votre navigateur. D'autres programmes (comme wget, ne seront pas affectés par cela). Ce n’est pas un problème en soi, mais il est peut-être préférable de le mentionner.
Willem Van Onsem le
Si vous choisissez la route .pac et que vous implémentez un serveur node.js, vous serez surpris de voir qu'il req.urls'agit désormais d'une URL absolue. Ceci est fait parce que l’hypothèse est que vous voulez écrire un serveur proxy réel, mais il est surprenant que vous utilisiez cette technique pour arrêter d’ajouter des entrées / etc / hosts pour le débogage. FYI à ceux qui pourraient aller dans la même voie que moi.
Tom Boutell le
5

J'ai rangé un de mes vieux projets:

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

exigences:

  • linux où avahi et python-avahi sont installables
  • vous êtes d'accord avec les domaines .local (avahi ne prend en charge aucun autre type)

Avantages par rapport à l'utilisation de Dnsmasq ou du proxy DNS python:

  • Les autres utilisateurs d'avahi / bonjour de votre réseau local peuvent résoudre les alias que vous créez et les annoncer au réseau (à condition que vous autorisiez l'accès au port 5353).
Airtonix
la source
4

Cette solution basée sur DNS fonctionnait parfaitement dans mon cas, sans rien installer: https://gist.github.com/fedir/04e60d679d5657d1f9f9aa10b3168282 (Mac OSX 10.9)

Fedir RYKHTIK
la source
Une telle solution incroyable pour Mac OSX.
iDev247
Lien mort, veuillez mettre à jour votre lien, votre solution ou, d'une certaine manière, déprécier cette réponse. À votre santé.
Eric Hodonsky
Fait (sauvegarde ajoutée)
Fedir RYKHTIK
3

Vous ne pouvez pas utiliser de caractère générique dans /etc/hosts.

Jetez un coup d'œil ici pour découvrir la procédure à suivre sous OS X avec BIND, le serveur DNS intégré mais inactif, et Apache.

Trevor
la source
5
Apache n'a rien à voir avec les sous-domaines.
Anonyme
3

Si vous souhaitez utiliser dnsmasqavec NetworkManagervous pouvez (ou même doit?) Commencer à dnsmasqpartir NetworkManageren ajoutant

dns=dnsmasq

à /etc/NetworkManager/NetworkManager.conf. Ensuite, la configuration Dnsmasq va à /etc/NetworkManager/dnsmasq.confou /etc/NetworkManager/dnsmasq.d/resp.

TNT
la source
2

Réponse courte:

Votre fichier / etc / hosts / ne vous laissera pas utiliser de jokers ou de numéros de port. Vous devrez créer une entrée pour chacun de vos sous-domaines.

Marcos Placona
la source
2
Qu'est-ce qui vous permettrait de spécifier les numéros de port? Pas DNS autant que je sache.
Ptman
2

La réponse courte est que vous ne le faites pas. La réponse plus longue est que vous devez être plus clair sur ce que vous désirez réellement réaliser, car il existe peut-être une meilleure façon et une manière différente de la réaliser.

Pour l'hébergement Web (je ne l'ai jamais vu utilisé autrement), DNS est associé à un serveur Web prenant en charge l'hébergement virtuel. Pour plus d'informations sur les enregistrements DNS génériques (Wikipedia) et sur un article Hébergement de génériques avec Apache et Bind pour Linux à l'aide de bind et Apache.

Au pire, vous pourriez utiliser un serveur DNS local, je suppose.

mctylr
la source
2

Une tâche courante pour ce sujet consiste à mapper des répertoires sur des sous-domaines. Un moyen très simple pour cela consiste à ajouter automatiquement les entrées basées sur les répertoires au fichier hosts:

#! / usr / bin / python

importation os

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

lines = hostsFile.readlines ()

pour fileName dans os.listdir ('/ opt / subdomainDirs'):

    entryExists = False
    pour ligne en ligne:
        si fileName en ligne:
            entryExists = True  

    si non entryExists:
        hostsFile.write ("127.0.0.1" + nom de fichier + ".hôtelocal \ n");
Lukas Glowania
la source
2

Merci tschundeee pour ce que je considère être la réponse ultime à cette question, j'aimerais pouvoir commenter, mais voici la configuration totale pour ceux qui essaient d'atteindre l'objectif initial (les caractères génériques pointant tous sur le même codebase - n'installez rien, environnement de développement, par exemple , XAMPP)

fichier hosts (ajouter une entrée)

fichier: / etc / hosts (non-windows)

127.0.0.1   example.local

Configuration de httpd.conf (enable vhosts)

fichier: /XAMPP/etc/httpd.conf

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

Configuration de httpd-vhosts.conf

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

redémarrer apache

créer un fichier pac:

enregistrez-le sous le nom que vous voulez.pac où vous voulez, puis chargez le fichier dans le réseau du navigateur> proxy> paramètres de configuration automatique (rechargez-le si vous le modifiez)

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

Dnsmasq a travaillé pour moi, sauf que j'ai dû faire quelques pas supplémentaires.

Voici la procédure complète:

  1. Ajouter /etc/resolv.confavec la ligne suivante

    nameserver 127.0.0.1
    
  2. Ajoutez les lignes suivantes à /etc/dnsmasq.conf

    listen-address=127.0.0.1
    address=/localhost.localdomain/127.0.0.1
    address=/localhost/127.0.0.1
    
  3. Redémarrez Dnsmasq

Jbangerter
la source
Cela ne fonctionnera pas si votre distribution utilise netplan (ubuntu 18.04, je vous regarde)
MrMesees