Nel mio / etc / hosts / file su Linux / OSX, come posso fare un sottodominio con caratteri jolly?


170

Devo testare i sottodomini sul mio localhost. Come posso effettivamente ottenere questo risultato aggiungendo *.localhost.comal mio /etc/hosts/file?

Se non è possibile, come aggirare questo problema? Devo testare i sottodomini jolly sul mio local server. È un devserver Django, il server dev Django può gestire i sottodomini? Qualche altro software / routing può darmi il risultato finale che desidero?


1
Appartiene al superutente?
Paul R

So che la gente dice che non è possibile! Ma come lo faccio comunque! Qual è qualcosa al di fuori di / etc / hosts / che posso usare per ottenere l'effetto. Sto testando un server di sviluppo.
MikeN,


Poiché la maggior parte delle risposte si concentra sulla tua prima domanda (caratteri jolly del sottodominio localhost), risponderò alla tua domanda secondaria come commento: sì, il server dev Django è perfettamente in grado di gestire i sottodomini localhost, devi solo convincere il tuo browser e il tuo sistema operativo per inviare il traffico a modo suo (utilizzando una delle varie soluzioni di seguito)!
hheimbuerger

Risposte:


44

Ho scritto un proxy DNS in Python. Leggerà le voci jolly in / etc / hosts. Vedi qui: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py


Questo è perfetto! Ho cercato una soluzione semplice come questa per molto tempo (lavorando su OSX Mavericks BTW)
Billy Moon,

2
ora, se solo potessimo pip installfarlo :)
metakermit

1
Ho installato questo, fatto tutto ed eseguito, ma non blocca i siti.
DisplayName

Non posso votarlo abbastanza. Ne ho sempre avuto bisogno, mi sono imbattuto in questo gioiello di domande e risposte, e sono un po 'un hacker di Python, e questo è un bel bocconcino. Grazie per la condivisione!
Farley,

153

Installa dnsmasq (lo faccio su tutti i miei desktop Linux come cache DNS comunque). In dnsmasq.confaggiungi la riga:

address=/localhost.com/127.0.0.1

7
Brillante! Nota per gli utenti Mac, è davvero così semplice: 1. sudo port install dnsmasq2. modifica /opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
tomc

17
OSX con brew: come sopra ma brew install dnsmasq
Matt Humphrey

1
fyi brew> port (con riferimento a @MattHumphrey)
electblake

1
Questo esempio non funziona per me, forse perché sto usando vagrantup.com per la pubblicazione locale. Non preoccuparti, ho già cambiato l'IP con quello corretto 192.168.50.11ma il DNS non si sta risolvendo. Qualche idea, questo esempio è corretto per gli IP "non-127.0.0.1"?
Brian,

6
Ottimo consiglio Per un desktop Ubuntu 14.04 (che esegue dnsmasq per impostazione predefinita), creare un file chiamato /etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.confe inserire la linea address=/localhost.com/127.0.0.1al suo interno, quindi riavviare.
user38397,

60

Non è possibile specificare caratteri jolly nel /etc/hostsfile. Specificare i nomi host richiesti in modo esplicito o in alternativa impostare un server dei nomi locale con le regole appropriate.


15

È necessario impostare un server DNS e fare in modo che ciascun client lo utilizzi per la risoluzione. Il server stesso può essere qualcosa di "leggero" come dnsmasq o pesante come BIND .


+1 per dnsmasq, che è davvero ben documentato e facile da usare
David Schmitt,

dnsmasq non è in grado di farlo.
DisplayName

Quale parte del comportamento descritto nella --address=sezione della pagina man dnsmasq.conf non copre il caso d'uso descritto sopra?
Gerald Combs,

11

Flusso di lavoro semplice (non è necessario installare nulla)

Personalmente mi piace creare un file PAC per questo e fare in modo che il mio browser lo usi.

Passaggio 1: crea un file ad es .: *.proxy.pac*da qualche parte (utilizzo la mia $homecartella)

Passaggio 2: incollare questo codice (l'esempio è con la porta 8000):

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

Passaggio 3 : fai in modo che il tuo browser utilizzi questo file PAC.

Video Youtube per PAC e Firefox

Passaggio 4 : ora puoi testare la tua app accedendo a:http://mysubdomain.localhost/

Passaggio 5: divertiti :)


3
Forse vale la pena ricordare che questo influenzerà solo il tuo browser. Altri programmi (come wget, non ne saranno interessati). Questo non è di per sé un problema, ma forse è meglio menzionarlo.
Willem Van Onsem,

Se segui il percorso .pac e stai implementando un server node.js, rimarrai sorpreso nel vedere che req.urlora è un URL assoluto. Questo perché il presupposto è che si desidera scrivere un vero server proxy, ma è sorprendente se si è arrivati ​​a questa tecnica proprio come un modo per interrompere l'aggiunta di voci / etc / hosts per il debug. Cordiali saluti a coloro che potrebbero percorrere la stessa strada che ho fatto.
Tom Boutell,

5

Ho riordinato un mio vecchio progetto:

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

requisiti:

  • Linux dove sono installabili avahi e python-avahi
  • sei d'accordo con i domini .local (avahi non supporta nessun altro tipo)

Vantaggi rispetto all'utilizzo di dnsmasq o del proxy dns python:

  • altri utenti avahi / bonjour sulla tua rete locale possono risolvere gli alias creati e annunciati alla rete (a condizione che tu autorizzi l'accesso alla porta 5353)


3

Non è possibile utilizzare un carattere jolly in /etc/hosts.

Dai un'occhiata qui per una buona guida su come realizzare su OS X usando BIND, il server DNS integrato ma inattivo e Apache.


5
Apache non ha nulla a che fare con i sottodomini.
Anonimo

3

Se si desidera utilizzare dnsmasqcon NetworkManagersi può (anzi deve?) Cominciare dnsmasqda NetworkManageraggiungendo

dns=dnsmasq

a /etc/NetworkManager/NetworkManager.conf. Quindi la configurazione di dnsmasq va /etc/NetworkManager/dnsmasq.confo /etc/NetworkManager/dnsmasq.d/risp.


2

Risposta breve:

Il tuo file / etc / hosts / non ti permetterà di usare caratteri jolly o numeri di porta. Dovrai creare una voce per ciascuno del tuo sottodominio


2
Cosa ti permetterebbe di specificare i numeri di porta? Non DNS AFAIK.
ptman,

2

La risposta breve è che non lo fai. La risposta più lunga è che devi essere più chiaro su ciò che desideri effettivamente ottenere, perché forse c'è un modo migliore e un modo diverso per raggiungerlo.

Per l'hosting web (non l'ho mai visto utilizzato diversamente) viene eseguito in DNS in combinazione con un server Web sensibile all'hosting virtuale. Per ulteriori informazioni sui record DNS jolly (Wikipedia) e un articolo Hosting jolly con Apache e Bind per Linux utilizzando bind e Apache.

Nel peggiore dei casi, potresti usare un server DNS locale, suppongo.


2

Un compito comune per questo argomento è mappare le directory sui sottodomini. Un modo molto semplice per quello è quello di aggiungere automaticamente le voci basate su directory al file hosts:

#! / Usr / bin / python

import os

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

lines = hostsFile.readlines ()

per fileName in os.listdir ('/ opt / subdomainDirs'):

    entryExists = False
    per linea in linea:
        se fileName in linea:
            entryExists = True  

    in caso contrario entryExists:
        hostsFile.write ("127.0.0.1" + fileName + ".localhost \ n");

2

Grazie tschundeee per quella che considero la risposta definitiva a questo problema, vorrei poter commentare, ma ecco la configurazione totale per coloro che cercano di raggiungere l'obiettivo originale (i caratteri jolly puntano tutti allo stesso codice - installa nulla, ambiente di sviluppo, ad es. , XAMPP)

file hosts (aggiungi una voce)

file: / etc / hosts (non Windows)

127.0.0.1   example.local

configurazione httpd.conf (abilita vhosts)

file: /XAMPP/etc/httpd.conf

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

configurazione httpd-vhosts.conf

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

riavvia apache

crea file pac:

salva come whatever.pac dove vuoi e poi carica il file nella rete del browser> proxy> impostazioni auto_configuration (ricarica se lo modifichi)

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

2

dnsmasq ha funzionato per me, tranne per il fatto che ho dovuto fare alcuni passaggi aggiuntivi.

Ecco la procedura completa:

  1. Prepara /etc/resolv.confcon la seguente riga

    nameserver 127.0.0.1
    
  2. Aggiungi le seguenti righe a /etc/dnsmasq.conf

    listen-address=127.0.0.1
    address=/localhost.localdomain/127.0.0.1
    address=/localhost/127.0.0.1
    
  3. Riavvia dnsmasq


Questo non funzionerà se la tua distribuzione usa netplan (ubuntu 18.04 ti guardo)
MrMesees,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.