En mi archivo / etc / hosts / en Linux / OSX, ¿cómo hago un subdominio comodín?

170

Necesito probar subdominios en mi localhost. ¿Cómo puedo tener efectivamente este resultado de agregar *.localhost.coma mi /etc/hosts/archivo?

Si no es posible, ¿cómo puedo solucionar este problema? Necesito probar subdominios comodín en mi servidor local. Es un servidor de desarrollo de Django, ¿puede el servidor de desarrollo de Django manejar los subdominios? ¿Puede algún otro software / enrutamiento darme el resultado final que quiero?

MikeN
fuente
1
Pertenece a superusuario?
Paul R
¡Sé que la gente dice que no es posible! ¡Pero cómo lo hago de todos modos! ¿Qué es algo fuera de / etc / hosts / que puedo usar para obtener el efecto? Estoy probando un servidor de desarrollo.
MikeN
en superusuario: unix.stackexchange.com/questions/3352/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Como la mayoría de las respuestas se centran en su primera pregunta (comodines de subdominio localhost), responderé a su pregunta secundaria como un comentario: sí, el servidor de desarrollo de Django es perfectamente capaz de manejar subdominios localhost, solo tiene que convencer a su navegador y su sistema operativo para enviar el tráfico a su manera (usando una de las varias soluciones a continuación)!
hheimbuerger

Respuestas:

44

He escrito un proxy dns en Python. Leerá entradas comodín en / etc / hosts. Ver aquí: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py

marlonyao
fuente
¡Esto es perfecto! He estado buscando una solución simple como esta durante mucho tiempo (trabajando en OSX Mavericks BTW)
Billy Moon
2
ahora, si tan solo pudiéramos pip installhacerlo :)
metakermit
1
Instalé esto, hice todo y lo ejecuté, pero no bloquea los sitios.
DisplayName
No puedo votar esto lo suficiente. Lo he necesitado para siempre, me topé con esta joya de preguntas y respuestas, y soy un poco hacker de Python, y este es un buen dato. ¡Gracias por compartir!
Farley
153

Instale dnsmasq (de todos modos hago esto en todos mis escritorios Linux como caché DNS). En dnsmasq.confagregar la línea:

address=/localhost.com/127.0.0.1
tomchuk
fuente
77
¡Brillante! Nota para los usuarios de Mac, realmente es así de simple: 1. sudo port install dnsmasq2. editar /opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
tomc
17
OSX con brew: igual que el anterior pero brew install dnsmasq
Matt Humphrey
1
fyi brew> port (re sugerencia de @MattHumphrey)
electblake
1
Este ejemplo no funciona para mí, posiblemente porque estoy usando vagrantup.com para servir localmente. No se preocupe, ya cambié la IP a la correcta 192.168.50.11pero DNS no se está resolviendo. ¿Alguna idea, es este ejemplo correcto para IP "no 127.0.0.1"?
Brian
66
Gran consejo Para un escritorio Ubuntu 14.04 (que ejecuta dnsmasq de manera predeterminada), cree un archivo llamado /etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.confy coloque la línea address=/localhost.com/127.0.0.1en él, luego reinicie.
user38397
60

No es posible especificar comodines en el /etc/hostsarchivo. Especifique los nombres de host requeridos explícitamente o, alternativamente, configure un servidor de nombres local con las reglas apropiadas.

Arkansas.
fuente
15

Debe configurar un servidor DNS y hacer que cada cliente lo use para la resolución. El servidor en sí puede ser algo tan "ligero" como dnsmasq o tan pesado como BIND .

Gerald Peines
fuente
+1 para dnsmasq, que está muy bien documentado y es fácil de usar
David Schmitt,
dnsmasq no puede hacer esto.
DisplayName
¿Qué parte del comportamiento descrito en la --address=sección de la página de manual dnsmasq.conf no cubre el caso de uso descrito anteriormente?
Gerald Combs
11

Flujo de trabajo simple (no es necesario instalar nada)

Personalmente, me gusta crear un archivo PAC para eso y hacer que mi navegador solo lo use.

Paso 1: crea un archivo, por ejemplo: en *.proxy.pac*algún lugar (uso mi $homecarpeta)

Paso 2: pegue este código (el ejemplo es con el puerto 8000):

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

Paso 3 : Haz que tu navegador use este archivo PAC.

Video de Youtube para PAC y Firefox

Paso 4 : Ahora puedes probar tu aplicación accediendo a:http://mysubdomain.localhost/

Paso 5: Disfruta :)

Bijan
fuente
3
Quizás valga la pena mencionar que esto solo afectará a su navegador. Otros programas (como wget, no se verán afectados por esto). Eso no es en sí un problema, pero quizás sea mejor mencionarlo.
Willem Van Onsem
Si sigue la ruta .pac y está implementando un servidor node.js, se sorprenderá al ver que req.urlahora es una URL absoluta. Esto se hace porque se asume que desea escribir un servidor proxy real, pero es sorprendente si llegó a esta técnica solo como una forma de dejar de agregar entradas / etc / hosts para la depuración. Para su información, para aquellos que podrían seguir el mismo camino que yo hice.
Tom Boutell
5

He arreglado un viejo proyecto mío:

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

requisitos:

  • Linux donde avahi y python-avahi son instalables
  • estás de acuerdo con los dominios .local (avahi no admite ningún otro tipo)

Ventajas sobre el uso de dnsmasq o el proxy python dns:

  • otros usuarios de avahi / bonjour en su red local pueden resolver los alias que cree y anunciar a la red (siempre que permita el acceso al puerto 5353)
airtonix
fuente
4

Esta solución basada en DNS funcionó perfectamente en mi caso, sin necesidad de instalar nada: https://gist.github.com/fedir/04e60d679d5657d1f9f9aa10b3168282 (Mac OSX 10.9)

Fedir RYKHTIK
fuente
Una solución tan increíble para Mac OSX.
iDev247
Enlace inactivo, actualice su enlace, su solución o, de alguna manera, desapruebe esta respuesta. Salud.
Eric Hodonsky
Hecho (copia de seguridad agregada)
Fedir RYKHTIK
3

No puede usar un comodín en /etc/hosts.

Eche un vistazo aquí para ver un buen tutorial sobre cómo lograr en OS X usando BIND, el servidor DNS incorporado pero inactivo, y Apache.

Trevor
fuente
55
Apache no tiene nada que ver con subdominios.
Anónimo
3

Si desea utilizar dnsmasqcon el NetworkManagerque se puede (o incluso debe?) Comienzan dnsmasqa partir NetworkManagerañadiendo

dns=dnsmasq

a /etc/NetworkManager/NetworkManager.conf. Entonces la configuración de dnsmasq va a /etc/NetworkManager/dnsmasq.confo /etc/NetworkManager/dnsmasq.d/resp.

TNT
fuente
2

Respuesta corta:

Su archivo / etc / hosts / no le permitirá usar comodines o números de puerto. Deberá crear una entrada para cada uno de sus subdominios

Marcos Placona
fuente
2
¿Qué le permitiría especificar números de puerto? No es DNS AFAIK.
ptman
2

La respuesta corta es que no. La respuesta más larga es que necesita ser más claro sobre lo que desea lograr realmente, porque quizás haya una mejor manera y una forma diferente de lograrlo.

Para el alojamiento web (nunca he visto que se use de otra manera) se realiza en DNS en combinación con un servidor web virtual compatible con el alojamiento. Para obtener más información sobre registros DNS comodín (Wikipedia), y un artículo sobre alojamiento de comodines con Apache y Bind para Linux utilizando bind y Apache.

En el peor de los casos, podría usar un servidor DNS local, supongo.

mctylr
fuente
2

Una tarea común para este tema es asignar directorios a subdominios. Una forma muy sencilla de hacerlo es agregar automáticamente las entradas basadas en el directorio al archivo de hosts:

#! / usr / bin / python

importar os

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

lines = hostsFile.readlines ()

para fileName en os.listdir ('/ opt / subdomainDirs'):

    entryExists = False
    para línea en línea:
        if fileName en línea:
            entryExists = True  

    Si no es entryExists:
        hostsFile.write ("127.0.0.1" + fileName + ".localhost \ n");
Lukas Glowania
fuente
2

Gracias tschundeee por lo que considero que es la respuesta definitiva a este problema, ojalá pudiera comentar, pero aquí está la configuración total para aquellos que intentan lograr el objetivo original (comodines que apuntan a la misma base de código: no instalar nada, entorno de desarrollo, es decir , XAMPP)

archivo de hosts (agregar una entrada)

archivo: / etc / hosts (no Windows)

127.0.0.1   example.local

Configuración de httpd.conf (habilitar vhosts)

archivo: /XAMPP/etc/httpd.conf

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

Configuración de httpd-vhosts.conf

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

reiniciar apache

crear archivo pac:

guarde como whatever.pac donde quiera y luego cargue el archivo en la red del navegador> proxy> configuración de configuración automática (vuelva a cargar si lo modifica)

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

dnsmasq funcionó para mí, excepto que tuve que hacer algunos pasos adicionales.

Aquí está el procedimiento completo:

  1. Anteponer /etc/resolv.confla siguiente línea

    nameserver 127.0.0.1
    
  2. Agregue las siguientes líneas a /etc/dnsmasq.conf

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

jbangerter
fuente
Esto no funcionará si tu distribución usa netplan (ubuntu 18.04 te estoy mirando)
MrMesees