ti-enxame.com

Crie subdomínios em tempo real com o .htaccess (PHP)

Eu estou olhando para criar um sistema que na inscrição irá criar um subdomínio no meu site para a área de conta de usuários. 

por exemplo. johndoe.website.com

Eu acho que seria algo a ver com o arquivo .htaccess e possivelmente redirecionando para outro local no site? Eu não sei realmente. Mas qualquer informação para me começar seria muito apreciada.

Criar uma área de inscrição não é o problema - fiz isso muitas vezes. Eu não tenho certeza de onde começar com o subdomínio. 

119
Ben McRae

O rápido resumo

  1. Você precisa criar um domínio curinga no seu servidor DNS * .website.com
  2. Em seguida, no seu contêiner vhost, você precisará especificar o caractere curinga também * .website.com - Isso é feito em ServerAlias DOCs
  3. Em seguida, extraia e verifique o subdomínio em PHP e exiba os dados apropriados

A versão longa

1. Criar uma entrada DNS curinga

Nas suas configurações de DNS, você precisa criar uma entrada de domínio curinga como *.example.org. Uma entrada de caractere curinga é semelhante a esta:

*.example.org.   3600  A  127.0.0.1

2. Inclua o curinga no vhost

Em seguida, na configuração do Apache, você precisa configurar um contêiner vhost que especifique o caractere curinga no ServerAlias DOCs diretiva. Um exemplo de contêiner vhost:

<VirtualHost *:80>
  ServerName server.example.org
  ServerAlias *.example.org
  UseCanonicalName Off
</VirtualHost>

3. Trabalhe em qual subdomínio você está em PHP

Então, em seus scripts PHP, você pode descobrir o domínio procurando na variável super global $_SERVER. Aqui está um exemplo de pegar o subdomínio em PHP:

preg_match('/([^.]+)\.example\.org/', $_SERVER['SERVER_NAME'], $matches);
if(isset($matches[1])) {
    $subdomain = $matches[1];
}

Eu usei regex aqui para permitir que as pessoas acessem seu site por meio de www.subdominio.exemplo.org ou subdominio.exemplo.org.

Se você nunca antecipar ter que lidar com www. (ou outros subdomínios), então você poderia simplesmente usar uma substring assim:

$subdomain = substr(
                 $_SERVER['SERVER_NAME'], 0,
                 strpos($_SERVER['SERVER_NAME'], '.')
             );

Hospedagem Virtual em Massa

A hospedagem virtual em massa é um esquema ligeiramente diferente do descrito acima, em que você costuma usá-la para hospedar vários sites distintos, em vez de tentar usá-la para poder usar um aplicativo como a questão propõe.

Eu documentei meu ambiente de hospedagem virtual em massa com base no mod_rewrite antes em um post no meu blog , que você poderia verificar se essa é a rota que você deseja seguir. Há também, é claro, a respectiva página de manual do Apache .

O Apache também tem uma maneira interna de lidar com hospedagem virtual em massa que é um pouco menos flexível do que o método mod_rewrite que eu usei. Tudo isso é descrito na página de manual do Apache Host virtual em massa dinamicamente configurado .

121
Treffynnon

Você poderia permitir todos os subdomínios em primeiro lugar e, em seguida, verificar se o subdomínio é válido. Por exemplo:

RewriteEngine on
RewriteCond %{HTTP_Host} ^[^.]+\.example\.com$
RewriteRule !^index\.php$ index.php [L]

Dentro do index.php você pode extrair o subdomínio usando:

if (preg_match('/^([^.]+)\.example\.com$/', $_SERVER['HTTP_Host'], $match)) {
    var_dump($match[1]);
}

Mas tudo isso requer que o seu servidor web aceite todos os nomes de subdomínios.

12
Gumbo

Além de configurar um curinga DNS, você pode querer dar uma olhada em Dynamic Mass Virtual Hosting para Apache que é como eu resolvi isso no passado

7
Rowland Shaw

Eu achei mais fácil fazer isso com PHP. Na verdade, está criando um subdomínio no cPanel e crie sua pasta com o nome de domínio desejado. Como você vai fazer isso manualmente no cPanel, mas tudo isso é feito em milissegundos por uma função simples PHP. Nenhum clique necessário :)

function create_subdomain($subDomain,$cPanelUser,$cPanelPass,$rootDomain) {

    //  $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain;

    $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain . "&dir=public_html/subdomains/" . $subDomain;

    $openSocket = fsockopen('localhost',2082);
    if(!$openSocket) {
        return "Socket error";
        exit();
    }

    $authString = $cPanelUser . ":" . $cPanelPass;
    $authPass = base64_encode($authString);
    $buildHeaders  = "GET " . $buildRequest ."\r\n";
    $buildHeaders .= "HTTP/1.0\r\n";
    $buildHeaders .= "Host:localhost\r\n";
    $buildHeaders .= "Authorization: Basic " . $authPass . "\r\n";
    $buildHeaders .= "\r\n";

    fputs($openSocket, $buildHeaders);
        while(!feof($openSocket)) {
           fgets($openSocket,128);
        }
    fclose($openSocket);

    $newDomain = "http://" . $subDomain . "." . $rootDomain . "/";

   //  return "Created subdomain $newDomain";

}
5
Adrian P.

A maneira mais fácil é redirecionar todos os subdomínios (com curinga *) para apontar para seu /wwwroot..Em seguida, coloque .htaccess para esta pasta com o seguinte código:

RewriteCond %{ENV:REDIRECT_SUBDOMAIN} ="" 
RewriteCond %{HTTP_Host} ^([a-z0-9][-a-z0-9]+)\.domain\.com\.?(:80)?$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/%1 -d 
RewriteRule ^(.*) %1/$1 [E=SUBDOMAIN:%1,L] 
RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN},L]

Isso fará com que todas as subpastas da pasta/wwwroot sejam aceitas via subdomínio (foldername.domain.com).

Encontrei este ano atrás em http://www.webmasterworld.com/Apache/3163397.htm

5
Glavić

Mod_vhost_alias é o módulo certo para fazer isso.

Com uma linha, você pode dizer ao Apache para procurar no lugar certo, com hashing de diretório, etc. Por exemplo, a linha:

VirtualDocumentRoot /http/users/%3.1/%3.2/%3

diria ao Apache para definir a raiz do documento como/http/users/s/u/subdomain quando solicitado para subdomain.yourdomain.com

4
Julien Tartarin

Não tem nada a ver com o .htaccess. Você precisará configurar registros DNS e hospedagem virtual para os subdomínios.

4
chaos

Eu acho que o DNS wild card com o Dynamic Mass Host Virtual da Apache também é uma solução razoável. Embora eu nunca tenha tentado.

Se você tiver a necessidade de expandir para vários servidores ou se as outras soluções não funcionarem para você, recomendo usar um servidor DNS orientado por banco de dados. Eu usei com sucesso MyDNS no passado. Como ele usa o MySQL (ou PostgreSQL) você pode atualizar seu DNS rapidamente com PHP ou qualquer outra coisa. O código não parece ter sido atualizado há algum tempo, mas é o DNS e, portanto, não é exatamente de ponta. 

0
Barrett Conrad

Métodos de criação de subdomínio com curinga

Primeiro você tem que criar as configurações de DNS usando o seu editor de DNS do servidor.

  1. Crie o registro A nas configurações de DNS com o curinga host * no endereço IP do servidor. 

    * 1400 IN A ip_address

  2. Crie novamente um registro A nas configurações de DNS com Host @ ou domain_name.tld no endereço IP do servidor. tld significa domínios de nível superior ou a extensão dos domínios como .com, .org, etc ....

    @ 1400 IN A ip_address ou domain_name.tld 1400 IN A ip_address

  3. Crie um registro CNAME como:

    www 1400 IN A domainname.tld

  4. Crie o subdomínio com o caractere curinga *, como *.domain.tld
  5. Crie o htaccess no seu diretório subdomínio de *.domain.tld e coloque este código:

    Options +FollowSymLinks 
    RewriteEngine On 
    RewriteBase /
    RewriteRule ^([aA-zZ0-9]+)$ index.php?data=$1
    RewriteCond %{HTTP_Host} ^([aA-zZ0-9]+)\.([aA-zZ0-9-]+)\.([aA-zZ]+)
    RewriteRule ([aA-zZ0-9]+) index.php?data=%1
    

    Teste seu primeiro subdomínio de curingas como example.domainname.tld

Se você não tiver interesse em passar os dados como parâmetro usando o htaccess, também poderá obter os dados usando a seguinte codificação:

define("SUBDOMAIN_PARENT","domainname.tld");   
class getData
    {
         function __construct()
        {
            $this->data="";
            $http_Host=$_SERVER['HTTP_Host'];
         $subdom_data= str_replace(SUBDOMAIN_PARENT,"",$http_Host);
         $expl_subdom_data=explode(".",$subdom_data);
      $expl_subdom_data=array_filter($expl_subdom_data);

            if($expl_subdom_data!=NULL)
            {
           $this->data=end($expl_subdom_data);
            }
       }
    }
$GLOBALS['get_data']=new getData();

e use sua variável global em qualquer lugar como global $get_data.

echo $get_data->data; //example

(nota: Esta classe é usada principalmente para obter o subdomínio exato de http_Host. porque alguns nomes extras combinados antes do seu subdomínio também são aplicáveis ​​como www.example.domainname.tld. Esse retorno $_GET['data']='wwww' Então, minha sugestão é usar o $_SERVER['http_Host'] para obter os valores exatos em vez de usar o $_SERVER['query_string'] ou passou parâmetros de htaccess na sua página de índice)

6.Aumente a velocidade de execução desses subdomínios curinga N segundos em TTL - CONFIGURAÇÕES DE DNS.

7. Verifique o subdomínio após o seu tempo ttl (600 - 10 minutos) como => http://abc.domain.tld

(nota: subdomínios curinga não substituem os subdomínios existentes. Porque Primeira prioridade sempre para os seus subdomínios existentes)

0
karthikeyan ganesan