Como permitir que o PHP crie subdomínios automaticamente para cada usuário?

162

Como crio um subdomínio como http://user.mywebsite.com ? Preciso acessar o htaccess de alguma forma? É realmente possível criá-lo via código php puro ou preciso usar alguma linguagem externa do lado do servidor de scripts?

Para aqueles que responderam: Bem, então, devo perguntar à minha hospedagem se eles fornecem algum tipo de acesso ao DNS?

Skuta
fonte
Talvez não seja necessário solicitar ao seu provedor acesso DNS, já que o roteamento de subdomínio (resposta de Mark) já está ativado! Apenas tente no seu navegador se os subdomínios derem um resultado. E encaminhe-os com o arquivo .htaccess.
powtac 8/10/08
Se você pode usar wildcard subdomainsisso pode ser alcançado em .htaccess. Veja minha solução.
21816 Dan Bray

Respostas:

135

Você está procurando criar um registro A personalizado .

Tenho certeza de que você pode usar caracteres curinga ao especificar registros A, o que permitiria fazer algo assim:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1 seria o endereço IP do seu servidor da web. O método de realmente adicionar o registro dependerá do seu host.


Fazer isso como http://mywebsite.com/user seria muito mais fácil de configurar, se for uma opção.

Em seguida, você pode adicionar um arquivo .htaccess semelhante a este:

Options +FollowSymLinks

RewriteEngine On
RewriteRule ^([aA-zZ])$  dostuff.php?username=$1

Acima, os nomes de usuário são limitados aos caracteres az


A regra de reescrita para capturar o subdomínio ficaria assim:

RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com
RewriteRule (.*)  dostuff.php?username=%1
Mark Biek
fonte
1
A menos que cada subdomínio seja atendido em um servidor diferente, eu criaria registros Canonical Name (CNAME) seria um plano melhor. en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear 8/08
O subdomínio parece bom. Vai ser muito mais trabalhoso configurar, porque você precisará garantir que todas as solicitações de subdomínio sejam tratadas corretamente. Isso não é terrível com o Apache, mas pode ser complicado em um ambiente hospedado.
Mark Biek
@theraccoonbear Supondo que você também possa usar curingas com CNAME, isso é um pensamento.
Mark Biek
3
Eu deveria ter sido mais específico. .htaccess é para Apache, não para IIS. Não tenho certeza de como a reescrita de URL é tratada com o IIS, mas acredito que houve algumas perguntas sobre isso no SO.
Mark Biek 9/10/08
1
oi mark, segui as etapas que você deu acima, mas quando eu faço xyz.mydomain.com ele redireciona para xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... Preciso fazer mais alguma coisa que as etapas mencionadas acima ?
Ashish Rajan
30

O recurso que você procura é chamado de Subdomínios curinga . Ele permite que você não precise configurar o DNS para cada subdomínio e, em vez disso, use as regravações do apache para o redirecionamento. Você pode encontrar um bom tutorial aqui , mas existem milhares de tutoriais por aí. Aqui está o código necessário desse tutorial:

<VirtualHost 111.22.33.55>
    DocumentRoot /www/subdomain
    ServerName www.domain.tld
    ServerAlias *.domain.tld
</VirtualHost>

No entanto, como exigia o uso do VirtualHosts, ele deve ser definido no arquivo httpd.conf do servidor, em vez de em um .htaccess local.

Balupton
fonte
Não consigo acessar o arquivo httpd.conf porque estou em hospedagem compartilhada. o que eu posso fazer?
Webber Depor
23

Eu faço isso um pouco diferente de Mark. Passo o domínio inteiro e pego o subdomínio no php.

RewriteCond {REQUEST_URI} !\.(png|gif|jpg)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?uri=$1&hostName=%{HTTP_HOST}

Isso ignora imagens e mapeia todo o resto para o meu arquivo index.php. Então, se eu for para

http://fred.mywebsite.com/album/Dance/now

eu voltei

http://fred.mywebsite.com/index.php?uri=album/Dance/now&hostName=fred.mywebsite.com

Então, no meu código index.php, apenas explodo meu nome de usuário do hostName. Isso me fornece bons e belos URLs de SEO.

gradbot
fonte
14

Configuramos o DNS curinga como explicado acima. Portanto, o registro a é * .yourname.com

Todos os subdomínios estão indo para o mesmo local, mas o PHP trata cada subdomínio como uma conta diferente.

Usamos o seguinte código:

$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);

Esse código apenas define a $accountvariável da mesma forma que o subdomínio. Você pode recuperar os arquivos e outras informações com base na conta deles.

Provavelmente, isso não é tão eficiente quanto as formas listadas acima, mas se você não tiver acesso ao BIND e / ou acesso .ht limitado, esse método funcionará (desde que seu host configure o curinga para você).

Na verdade, usamos esse método para conectar-se ao banco de dados de clientes de um aplicativo de comércio eletrônico para várias empresas, mas também pode funcionar para você.

Volomike
fonte
2
Eu acho que isso deve ser a resposta correta, como op perguntar sobre como o PHP lida com subdmoins NÃO como servidores da Web ou DNS manipulam subdomínios.
Salem
8

Não se preocupe com arquivos .htaccess quando você pode usar a hospedagem virtual em massa do Apache .

A partir da documentação:

#include part of the server name in the filenames VirtualDocumentRoot /www/hosts/%2/docs

De certa forma, é o inverso da sua pergunta: todo 'subdomínio' é um usuário. Se o usuário não existir, você receberá um 404.

A única desvantagem é que a variável de ambiente DOCUMENT_ROOTnão está configurada corretamente para o subdiretório usado , mas a raiz_do_processo padrão no htconfig.

Willem
fonte
1
Não tenho muita certeza de como usar isso ... e no final, por que não mexer com o htaccess?
Skuta
6

Solução PHP simples para subdomínios e aplicativos da web com vários domínios

Etapa 1. Forneça um registro DNS como "*" para domínios (ou domínio) que você servirá "example.org"

A record => *.example.org
A record => *.example.net

Etapa 2. Verifique a exclusividade dos logins ao registrar ou alterar o login do usuário. Além disso, evite pontos nesses logins.

Etapa 3. Em seguida, verifique a consulta

        // Request was http://qwerty.example.org
        $q = explode('.', $_SERVER['HTTP_HOST']);
        /*
            We get following array
            Array
            (
                [0] => qwerty
                [1] => example
                [2] => org
            )
        */

        // Step 4.
        // If second piece of array exists, request was for 
        // SUBDOMAIN which is stored in zero-piece $q[0]
        // otherwise it was for DOMAIN

        if(isset($q[2])) {
            // Find stuff in database for login $q[0] or here it is "qwerty"
            // Use $q[1] to check which domain is asked if u serve multiple domains
        }

?>

Esta solução pode servir domínios diferentes

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

Se você precisar dos mesmos nicks em domínios diferentes servidos de maneira diferente, pode ser necessário armazenar a escolha do usuário para o domínio ao registrar o login.

smith.example.org // Show info about John Smith
smith.example.net // Show info about Paul Smith 
Alex Khimich
fonte
4

Você poderia [potencialmente] reescrever a URL, mas sim: você precisa controlar suas configurações de DNS para que, quando um usuário for adicionado, obtenha seu próprio subdomínio.

Warren
fonte
4

Além das alterações de configuração no servidor WWW para manipular o novo subdomínio, seu código precisaria fazer alterações nos registros DNS. Portanto, a menos que você esteja executando seu próprio BIND (ou similar), precisará descobrir como acessar a configuração do provedor de servidor de nomes. Se eles não oferecem algum tipo de API, isso pode ser complicado.

Atualização: sim, eu verificaria com seu registrador se eles também estão fornecendo o serviço de servidor de nomes (como costuma ser o caso). Eu nunca explorei essa opção antes, mas suspeito que a maioria dos registradores de consumidores não. Pesquisei no Google pelas APIs GoDaddy e DNS DNS da GoDaddy, mas não consegui encontrar nada, então acho que a melhor opção seria consultar a ajuda on-line com seu provedor e, se isso não responder à pergunta, aguarde. de sua equipe de suporte.

theraccoonbear
fonte
3

Primeiro, você precisa verificar se o servidor está configurado para permitir subdomínios curinga. Consegui isso no JustHost criando um sub-domínio chamado manualmente *. Também especifiquei uma pasta chamada subdomainscomo raiz do documento para subdomínios curinga. Adicione isso a um .htaccessarquivo na sua pasta de subdomínios:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

Por fim, tudo o que você precisa fazer é criar uma pasta na pasta de subdomínios e colocar os arquivos do subdomínio nesse diretório.

Dan Bray
fonte
3

Isso pode ser alcançado .htaccessdesde que o servidor esteja configurado para permitir subdomínios curinga. Consegui isso no JustHost criando um sub-domínio nomeado manualmente *e especificando uma pasta chamada subdomínios como a raiz do documento para subdomínios curinga. Adicione isso ao seu .htaccessarquivo:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

Por fim, crie uma pasta para o seu subdomínio e coloque os arquivos dos subdomínios.

Dan Bray
fonte
1

Eu só queria acrescentar que, se você usa o CloudFlare (gratuito), pode usar a API deles para gerenciar seu DNS com facilidade.

kiwixz
fonte
0

Crie subdomínios dinâmicos usando PHP e Htaccess

(1) .htaccess raiz

Este arquivo é redirecionado http://www.yourwebsite.com para http://yourwebsite.com para uso da página inicial. Todo o redirecionamento de subdomínio para yourwebsite_folder

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^yourwebsite\.com $
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

(2) Pasta interna .htaccess

Este arquivo está reescrevendo os URLs do subdomínio.

http://yourwebsite.com/index.php?siteName=9lessons para http://9lessons.yourwebsite.com

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1

Mais dicas sobre .htaccess: Tutorial e dicas sobre arquivos Htaccess.

index.php

Este arquivo contém código PHP simples, usando expressões regulares validando o valor do subdomínio.

<?php
$siteName='';
if($_GET['siteName'] )
{
$sitePostName=$_GET['siteName'];
$siteNameCheck = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $sitePostName);
   if($siteNameCheck)
   {
     //Do something. Eg: Connect database and validate the siteName.
   }
   else
  {
    header("Location: http://yourwebsite.com/404.php");
   }
}
?>
//HTML Code
<!DOCTYPE html>
<html>
<head>
<title>Project Title</title>
</head>
<body>
<?php if($siteNameCheck) { ?>
//Home Page
<?php } else { ?>
//Redirect to Subdomain Page.
<?php } ?>
</body>
</html>

Nenhuma pasta de subdomínio

Se você estiver usando o diretório raiz (htdocs / public_html) como um diretório do projeto, use este arquivo .htaccess a seguir.

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1
Abdo-Host
fonte