No meu arquivo / etc / hosts / no Linux / OSX, como faço para um subdomínio curinga?


170

Preciso testar subdomínios no meu host local. Como posso efetivamente obter esse resultado da adição *.localhost.comao meu /etc/hosts/arquivo?

Se não for possível, como faço para solucionar esse problema? Preciso testar subdomínios curinga no meu servidor local. É um servidor de desenvolvimento Django. O servidor de desenvolvimento Django pode lidar com os subdomínios? Outro software / roteamento pode me dar o resultado final que eu quero?


1
Pertence ao superusuário?
— Paul R

Eu sei que as pessoas dizem que não é possível! Mas como faço de qualquer maneira! O que é algo fora do / etc / hosts / I pode ser usado para obter o efeito. Estou testando um servidor de desenvolvimento.
— Miken


Como a maioria das respostas está focada na sua primeira pergunta (curingas do subdomínio localhost), responderei à sua pergunta secundária como um comentário: sim, o servidor de desenvolvimento Django é perfeitamente capaz de lidar com subdomínios localhost, basta convencer o navegador e o SO para enviar o tráfego do seu jeito (usando uma das várias soluções abaixo)!
— precisa saber é o seguinte

Respostas:


44

Eu escrevi um proxy DNS em Python. Ele lerá entradas curinga em / etc / hosts. Veja aqui: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py


Isto é perfeito! Fui à procura de uma solução simples como este por um longo tempo (Trabalhando em OSX Mavericks BTW)
— Billy Lua

2
agora, se pudéssemos apenas pip installele :)
— metakermit

1
Instalei isso, fiz tudo e executei, mas não bloqueia sites.
— DisplayName

Não é possível aprovar isso o suficiente. Eu precisava disso para sempre, me deparei com essa gema de perguntas e respostas, e sou um pouco hacker em Python, e esse é um boato interessante. Obrigado por compartilhar!
— Farley

153

Instale o dnsmasq (eu faço isso em todos os meus desktops Linux como um cache DNS). Em dnsmasq.confadicionar a linha:

address=/localhost.com/127.0.0.1

7
Brilhante! Nota para usuários de Mac, é realmente simples assim: 1. sudo port install dnsmasq2. edit /opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
— tomc 16/11/11

17
OSX com bebida: igual ao anterior, mas instalar bebida dnsmasq
— Matt Humphrey

1
fyi brew> port (re @MattHumphrey sugestão)
— electblake

1
Este exemplo não funciona para mim, possivelmente porque estou usando o vagrantup.com para veiculação local. Não se preocupe, eu já mudei o IP para o correto, 192.168.50.11mas o DNS não está resolvendo. Alguma idéia, este exemplo está correto para IP "non-127.0.0.1"?
— Brian

6
Ótima dica. Para um desktop Ubuntu 14.04 (que executa o dnsmasq por padrão), crie um arquivo chamado /etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.confe coloque a linha address=/localhost.com/127.0.0.1nele, depois reinicie.
— User38397 21/05

60

Não é possível especificar caracteres curinga no /etc/hostsarquivo. Especifique os nomes de host necessários explicitamente ou, alternativamente, configure um servidor de nomes local com as regras apropriadas.


15

Você precisa configurar um servidor DNS e ter cada cliente usá-lo para resolução. O próprio servidor pode ser algo "leve" como dnsmasq ou pesado como BIND .


+1 para dnsmasq, que é muito bem documentado e fácil de usar
— David Schmitt

O dnsmasq não pode fazer isso.
— DisplayName

Que parte do comportamento descrito na --address=seção da página do manual dnsmasq.conf não cobre o caso de uso descrito acima?
— Gerald Combs

11

Fluxo de trabalho simples (não é necessário instalar nada)

Pessoalmente, gosto de criar um arquivo PAC para isso e fazer com que meu navegador apenas o use.

Etapa 1: criar um arquivo, por exemplo: *.proxy.pac*algures (eu uso minha $homepasta)

Etapa 2: cole este código (o exemplo está na porta 8000):

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

Etapa 3 : faça seu navegador usar esse arquivo PAC.

Vídeo do YouTube para PAC e Firefox

Etapa 4 : agora você pode testar seu aplicativo acessando:http://mysubdomain.localhost/

Etapa 5: aproveite :)


3
Talvez valha a pena mencionar que isso afetará apenas o seu navegador. Outros programas (como wget, não serão afetados por isso). Isso não é, por si só, um problema, mas talvez seja melhor mencionar isso.
— Willem Van Onsem

Se você seguir a rota .pac e estiver implementando um servidor node.js., ficará surpreso ao ver que req.urlagora é uma URL absoluta. Isso é feito porque a suposição é que você deseja gravar um servidor proxy real, mas é surpreendente que você tenha usado essa técnica apenas como uma maneira de parar de adicionar entradas / etc / hosts para depuração. FYI para aqueles que podem seguir o mesmo caminho que eu.
— Tom Boutell

5

Eu arrumei um projeto antigo meu:

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

requisitos:

  • linux onde avahi e python-avahi são instaláveis
  • você está bem com domínios .local (o avahi não suporta nenhum outro tipo)

Vantagens sobre o uso do dnsmasq ou do proxy python dns:

  • outros usuários avahi / bonjour em sua rede local podem resolver os aliases que você cria e anuncia à rede (desde que você permita acesso à porta 5353)


3

Você não pode usar um curinga no /etc/hosts.

Veja aqui uma boa explicação sobre como realizar o OS X usando o BIND, o servidor DNS interno mas inativo, e o Apache.


5
O Apache não tem nada a ver com subdomínios.
— Anônimo

3

Se você quiser usar dnsmasqcom NetworkManagervocê pode (ou deve mesmo?) Começam dnsmasqa partir NetworkManageradicionando

dns=dnsmasq

para /etc/NetworkManager/NetworkManager.conf. Então a configuração do dnsmasq vai para /etc/NetworkManager/dnsmasq.confou /etc/NetworkManager/dnsmasq.d/resp.


2

Resposta curta:

Seu arquivo / etc / hosts / não permitirá que você use curingas ou números de porta. Você precisará criar uma entrada para cada um de seu subdomínio


2
O que permitiria especificar números de porta? Não é DNS AFAIK.
— Pt

2

A resposta curta é que você não. A resposta mais longa é que você precisa ser mais claro sobre o que realmente deseja alcançar, porque talvez haja uma maneira melhor e uma maneira diferente de alcançá-la.

A hospedagem na web (nunca vi usada de outra forma) é feita no DNS em combinação com um servidor web com reconhecimento de hospedagem virtual. Para obter mais informações sobre registros DNS de caracteres curinga (Wikipedia), e um artigo Hospedagem de caracteres curinga com Apache e Bind for Linux usando bind e Apache.

Na pior das hipóteses, você poderia usar um servidor DNS local, suponho.


2

Uma tarefa comum para esse assunto é mapear diretórios para subdomínios. Uma maneira bem simples de fazer isso é anexar automaticamente as entradas baseadas em diretório no arquivo hosts:

#! / usr / bin / python

importação os

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

lines = hostsFile.readlines ()

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

    entryExists = False
    para linha em linha:
        se fileName na linha:
            entryExists = True  

    if not entryExists:
        hostsFile.write ("127.0.0.1" + nome do arquivo + ".localhost \ n");

2

Obrigado tschundeee pelo que considero ser a resposta definitiva para esse problema, gostaria de poder comentar, mas aqui está a configuração total para aqueles que tentam atingir o objetivo original (curingas todos apontando para a mesma base de código - não instale nada, ambiente de desenvolvimento ou seja, , XAMPP)

arquivo hosts (adicione uma entrada)

arquivo: / etc / hosts (não Windows)

127.0.0.1   example.local

configuração httpd.conf (ativar vhosts)

arquivo: /XAMPP/etc/httpd.conf

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

Configuração httpd-vhosts.conf

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

reinicie o apache

crie um arquivo pac:

salve como o que quiser.pac onde quiser e carregue o arquivo na rede do navegador> proxy> configurações de configuração automática (recarregue se você alterar isso)

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

2

O dnsmasq funcionou para mim, exceto que eu tive que fazer algumas etapas adicionais.

Aqui está o procedimento completo:

  1. Anexar /etc/resolv.confcom a seguinte linha

    nameserver 127.0.0.1
    
  2. Adicione as seguintes linhas ao /etc/dnsmasq.conf

    listen-address=127.0.0.1
    address=/localhost.localdomain/127.0.0.1
    address=/localhost/127.0.0.1
    
  3. Reinicie o dnsmasq


Isso não funcionará se sua distribuição usar o netplan (ubuntu 18.04, estou olhando para você)
— MrMesees
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.