Pergunta

Eu sei que já houve alguns tópicos sobre isso antes, mas tentei absolutamente tudo o que foi sugerido (que pude encontrar) e nada funcionou para mim até agora...

Com isso em mente, aqui está o que estou tentando fazer:

Primeiro, quero permitir que os usuários publiquem páginas e dê a cada um deles um subdomínio de sua escolha (ex:usuário.meusite.com).Pelo que pude perceber, a melhor maneira de fazer isso é mapear user.mysite.com para mysite.com/user com mod_rewrite e .htaccess - correto?

Se isso estiver correto, alguém pode me dar instruções explícitas sobre como fazer isso?

Além disso, estou fazendo todo o meu desenvolvimento localmente, usando MAMP, então se alguém pudesse me dizer como configurar meu ambiente local para funcionar da mesma maneira (li que isso é mais difícil), eu agradeceria muito.Sinceramente, tenho tentado de tudo sem sucesso e, como é a primeira vez que faço algo assim, estou completamente perdido.Muito obrigado por qualquer ajuda!

Atualizar: Algumas dessas respostas foram MUITO úteis, mas para o sistema que tenho em mente, adicionar manualmente um subdomínio para cada usuário não é uma opção.O que realmente estou perguntando é como fazer isso rapidamente e redirecionar wildcard.mysite.com para mysite.com/wildcard - a forma como o Tumblr está configurado é um exemplo perfeito do que eu gostaria de fazer.Obrigado novamente!

Foi útil?

Solução

No que diz respeito à configuração do curinga do subdomínio DNS, isso seria uma função do seu provedor de hospedagem DNS.Essas seriam etapas diferentes dependendo de qual provedor de hospedagem você possui e seria uma pergunta melhor para eles.

Depois de configurar isso com o host DNS, no seu aplicativo da web você realmente estará apenas reescrevendo URL, o que pode ser feito com algum tipo de módulo para o próprio servidor da web, como reescrita isapi se você estiver no IIS (este seria a rota preferida, se possível).Você também pode lidar com a reescrita no nível do aplicativo (como usar o roteamento no ASP.NET).

Você reescreveria o URL então http://meunome.domínio.com se tornaria http://domain.com/something.aspx?name=meunome ou alguma coisa.A partir daí, basta lidar com isso como se o valor myname estivesse na string de consulta normalmente.Isso faz sentido?Espero não ter entendido mal o que você está procurando.

Editar:

Não estou sugerindo que você crie um subdomínio para cada usuário, mas sim crie um subdomínio curinga para o próprio domínio, então qualquer coisa.domain.com (basicamente *.domain.com) vai para o seu site.Tenho vários domínios configurados com meudomínio.As instruções para configurar isso são assim:

Sim, você pode configurar um curinga, mas só funcionará se você o configurar como um registro.Curingas não funcionam com um Nome C.Para usar um curinga, você Use o caractere Astericks '*'.Durante exemplo, se você criar e um registro usando um curinga, .Domain.com, qualquer coisa que seja inserida no local onde '' está localizado, vai resolver para o endereço IP especificado.Então, se você digite 'www', 'ftp', 'site', ou qualquer outra coisa antes do nome de domínio, ele sempre resolverá para o IP endereço

Eu tenho alguns que são configurados dessa maneira, fazendo com que *.domain.com acesse meu site.Posso então ler o URL base em meu aplicativo da web para ver se ryan.domain.com é o que foi acessado no momento ou se bill.domain.com é o que foi usado.Eu posso então:

  1. Use a reescrita de URL para que o subdomínio se torne parte da string de consulta OU
  2. Basta ler o valor do host na URL acessada e executar alguma lógica com base nesse valor.

Isso faz sentido?Tenho vários sites configurados exatamente desta maneira:crie o curinga para o domínio com o host DNS e simplesmente leia o host ou o domínio base da URL para decidir o que exibir com base no subdomínio (que na verdade era um nome de usuário)

Editar 2:

Não há como fazer isso sem uma entrada DNS.O "mundo online" precisa saber que name1.domain.com, name2.domain.com,...,nameN.domain.com vão todos para o endereço IP do seu servidor.A única maneira de fazer isso é com a entrada DNS apropriada.Você deve adicionar a entrada DNS curinga para o seu domínio com o seu host DNS.Então é só uma questão de você ler o subdomínio da URL e tomar as medidas apropriadas em seu código.

Outras dicas

A melhor coisa a fazer se você estiver executando *AMP é fazer o que Thomas sugere e fazer hosts virtuais no Apache.Você pode fazer isso com ou sem o redirecionamento descrito.

Anfitriões virtuais

Muito provavelmente você vai querer fazer hosts virtuais baseados em nome, pois é mais fácil de configurar e requer apenas um endereço IP (portanto, também será fácil de configurar e testar em sua máquina MAMP local).Hosts virtuais baseados em IP são melhores em alguns outros aspectos, mas você precisa ter um endereço IP para cada domínio.

Esse Página da Wikipédia discute as diferenças e links para um bom passo a passo básico de como fazer vhosts baseados em nomes na parte inferior.

Na sua máquina local para teste, você também terá que configurar nomes DNS falsos em /etc/hosts para seus nomes de domínio de teste falsos.ou sejase você tiver o Apache escutando no localhost e configurar vhost1.test.domain e vhost2.test.domain em suas configurações do Apache, basta adicionar esses domínios à linha 127.0.0.1 em /etc/hosts, após localhost:

127.0.0.1 localhost vhost1.test.domain vhost2.test.domain

Depois de editar o /etc/hosts e adicionar as configurações do host virtual baseado em nome ao(s) seu(s) arquivo(s) de configuração do Apache, é isso, reinicie o Apache e seus domínios de teste deverão funcionar.

Redirecionar com mod_rewrite

Se você quiser fazer redirecionamentos com mod_rewrite (para que user.example.com não seja hospedado diretamente e redirecione para example.com/user), você também precisará fazer um RewriteCond para corresponder ao subdomínio e redirecioná-lo:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^subdomain\.example\.com
RewriteRule ^(.*)$ http://example.com/subdomain$1 [R]

Você pode colocar isso em um .htaccess ou na configuração principal do Apache.

Você precisará adicionar um par de regras como as duas últimas para cada subdomínio que deseja redirecionar.Ou, você pode ser capaz de capturar o subdomínio em um RewriteCond para poder usar uma regra curinga para redirecionar *.example.com para example.com/ * -- mas isso cheira muito mal para mim do ponto de vista da segurança.

Todos juntos, vhosts e redirecionamento

É melhor ser mais explícito e configurar uma seção de configuração de host virtual para cada nome de host que você deseja escutar e colocar as regras de reescrita para cada um desses nomes de host dentro de sua configuração de host virtual.(É sempre mais seguro e rápido colocar esse tipo de coisa dentro da configuração do Apache e não no .htaccess, se você puder evitar - o .htaccess retarda o desempenho porque o Apache está constantemente vasculhando o sistema de arquivos em busca de arquivos .htaccess e analisando-os novamente, e é menos seguro porque eles podem ser confundidos pelos usuários.)

Todos juntos assim, a configuração do vhost dentro das configurações do Apache seria:

NameVirtualHost 127.0.0.1:80

# Your "default" configuration must go first
<VirtualHost 127.0.0.1:80>
  ServerName example.com
  ServerAlias www.example.com
  DocumentRoot /www/siteroot
  # etc.
</VirtualHost>

# First subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
  ServerName vhost1.example.com
  RewriteEngine On
  RewriteRule ^(.*)$ http://example.com/vhost1$1 [R]
</VirtualHost>

# Second subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
  ServerName vhost2.example.com
  RewriteEngine On
  RewriteRule ^(.*)$ http://example.com/vhost2$1 [R]
</VirtualHost>

Sei que demorei bastante para responder a esta pergunta, mas tive o mesmo problema em relação a uma solução de desenvolvimento local.Em outro tópico SO Encontrei soluções melhores e pensei em compartilhá-las com qualquer pessoa com a mesma dúvida no futuro:

Domínio curinga de propriedade da VMware que resolve qualquer subdomínio para 127.0.0.1:

vcap.me resolves to 127.0.0.1
www.vcap.me resolves to 127.0.0.1

ou para maior versatilidade, 37 Signals possui um domínio para mapear qualquer subdomínio para qualquer IP usando um formato específico:

127.0.0.1.xip.io resolves to 127.0.0.1
www.127.0.0.1.xip.io resolves to 127.0.0.1
db.192.168.0.1.xip.io resolves to 192.168.0.1

ver xip.io para mais informações

Estou no Ubuntu 16.04 e desde 14.04 uso a solução fornecida por Dave Evans aqui e funciona bem para mim.

  1. Instalar dnsmasq

    sudo apt-get install dnsmasq
    
  2. Criar novo arquivo localhost.conf sob /etc/dnsmasq.d dir com a seguinte linha

    #file /etc/dnsmasq.d/localhost.conf
    address=/localhost/127.0.0.1
    
  3. Editar /etc/dhcp/dhclient.conf e adicione a seguinte linha

    prepend domain-name-servers 127.0.0.1;
    

    (Você provavelmente descobrirá que esta linha já está lá e só precisa descomentá-la.)

  4. O último é reiniciar o serviço

    sudo systemctl restart dnsmasq
    sudo dhclient
    

Finalmente, você deve verificar se está funcionando.

dig whatever.localhost

observação:

Se você quiser usá-lo em seu servidor web, basta alterar o 127.0.0.0 para o seu endereço IP real.

Tive que fazer exatamente o mesmo em um dos meus sites.Você pode seguir os seguintes passos

  1. Se você possui cPanel em seu servidor, crie um subdomínio *, caso contrário, você terá que configurar um registro A em seu DNS (para BIND, consulte http://ma.tt/2003/10/wildcard-dns-and-sub-domains/).No seu desenvolvedor.servidor, seria muito melhor falsificar subdomínios adicionando cada um ao seu hosts arquivo.

  2. (Se você usou o cPanel, não precisará fazer isso).Você terá que adicionar algo como o seguinte ao seu arquivo vhosts do Apache.Depende muito do tipo de servidor (compartilhado ou não) que você está executando.O CÓDIGO A SEGUIR NÃO ESTÁ COMPLETO.É SÓ PARA DAR DIREÇÃO.OBSERVAÇÃO: ServerAlias example.com *.example.com é importante.

    <VirtualHost 127.0.0.1:80>  
            DocumentRoot /var/www/  
            ServerName example.com  
            ServerAlias example.com *.example.com  
    </VirtualHost>
    
  3. A seguir, já que você pode usar o script PHP para verificar o cabeçalho “Host” e descobrir o subdomínio e servir o conteúdo de acordo.

Primeiro, quero permitir que os usuários publicar páginas e dar-lhes um subdomínio de sua escolha (ex:usuário.meusite.com).Pelo que posso A melhor maneira de fazer isso é mapa user.mysite.com para mysite.com/user com mod_rewrite e .htaccess - é que correto?

Talvez seja melhor você usar hosts virtuais.Dessa forma, cada usuário pode ter uma configuração de servidor web praticamente independente dos demais.

A sintaxe é mais ou menos assim:

<VirtualHost *:80>
    DocumentRoot /var/www/user
    ServerName user.mysite.com
    ...
</VirtualHost>

Pelo que tenho visto em muitos webhosts, eles configuram um host virtual no Apache.

Portanto, se o seu www.mysite.com for veiculado em/var/www, você poderá criar uma pasta para cada usuário.Em seguida, mapeie o host virtual para essa pasta.

Com isso, mysite.com/user e user.mysite.com funcionam.

Quanto ao seu ambiente de teste, se você estiver no Windows, sugiro editar seu arquivo HOSTS para mapear mysite.com para seu PC local (127.0.0.1), bem como quaisquer subdomínios que você configurou para teste.

A solução que encontrei para o Ubuntu 18.04 é semelhante a Este mas envolve a configuração do NetworkManager:

  1. Edite o arquivo /etc/NetworkManager/NetworkManager.conf, e adicione a linha dns=dnsmasq para o [main] seção

    sudo editor /etc/NetworkManager/NetworkManager.conf
    

    deve ficar assim:

    [main]
    plugins=ifupdown,keyfile
    dns=dnsmasq
    ...
    
  2. Comece a usar o resolv.conf do NetworkManager

    sudo rm /etc/resolv.conf
    sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
    
  3. Crie um arquivo com sua configuração curinga

    echo 'address=/.localhost/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/localhost-wildcard.conf
    
  4. Recarregar configuração do NetworkManager

    sudo systemctl reload NetworkManager
    
  5. Teste-o

    dig localdomain.localhost
    

Você também pode adicionar qualquer outro domínio, bastante útil para alguns tipos de autenticação ao usar uma configuração de desenvolvimento local.

echo 'address=/.local-dev.workdomain.com/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/workdomain-wildcard.conf

Então isso funciona:

dig petproject.local-dev.workdomain.com

;; ANSWER SECTION:
petproject.local-dev.workdomain.com. 0 IN   A   127.0.0.1
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top