¿Cómo dejar que PHP cree un subdominio automáticamente para cada usuario?

162

¿Cómo creo un subdominio como http://user.mywebsite.com ? ¿Tengo que acceder a htaccess de alguna manera? ¿Es realmente posible crearlo a través de un código php puro o necesito usar algún lenguaje externo del servidor de script?

Para aquellos que respondieron: Bueno, entonces, ¿debería preguntarle a mi hosting si proporcionan algún tipo de acceso DNS?

Skuta
fuente
Quizás no sea necesario pedirle a su proveedor acceso DNS, ya que el enrutamiento del subdominio (respuesta de Mark) ya está activado. Simplemente intente en su navegador si los subdominios le dan un resultado. Y luego enrutarlos con el archivo .htaccess.
powtac
Si puede usar wildcard subdomainsesto se puede lograr en .htaccess. Mira mi solución.
Dan Bray

Respuestas:

135

Estás buscando crear un registro A personalizado .

Estoy bastante seguro de que puede usar comodines al especificar registros A que le permitirán hacer algo como esto:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1 sería la dirección IP de su servidor web. El método para agregar realmente el registro dependerá de su host.


Hacerlo como http://mywebsite.com/user sería mucho más fácil de configurar si es una opción.

Entonces podría simplemente agregar un archivo .htaccess que se vea así:

Options +FollowSymLinks

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

En lo anterior, los nombres de usuario están limitados a los caracteres az


La regla de reescritura para tomar el subdominio se vería así:

RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com
RewriteRule (.*)  dostuff.php?username=%1
Mark Biek
fuente
1
A menos que cada subdominio se sirva desde un servidor diferente, creo que crear registros de nombre canónico (CNAME) sería un mejor plan. en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear
El subdominio se ve bien. Sin embargo, será mucho más trabajo configurarlo porque tendrás que asegurarte de que todas las solicitudes de subdominio se manejen correctamente. Esto no es terrible con Apache, pero puede ser complicado en un entorno alojado.
Mark Biek
@theraccoonbear Asumiendo que también puedes usar comodines con CNAME, eso es un pensamiento.
Mark Biek
3
Debí haber sido más especifico. .htaccess es para Apache, no para IIS. No estoy seguro de cómo se maneja la reescritura de URL con IIS, pero creo que ha habido algunas preguntas al respecto en SO.
Mark Biek
1
hola marca, seguí los pasos que indicaste anteriormente, pero cuando hago xyz.mydomain.com redirige a xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... ¿Debo hacer algo más que los pasos mencionados anteriormente? ?
Ashish Rajan
30

La característica que busca se llama Subdominios comodín . Le permite no tener que configurar DNS para cada subdominio y, en su lugar, usar reescrituras de apache para la redirección. Puede encontrar un buen tutorial aquí , pero hay miles de tutoriales disponibles. Aquí está el código necesario de ese tutorial:

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

Sin embargo, dado que requería el uso de VirtualHosts, debe establecerse en el archivo httpd.conf del servidor, en lugar de un .htaccess local.

Balupton
fuente
No puedo acceder al archivo httpd.conf ya que estoy en un alojamiento compartido. ¿que puedo hacer?
Webber Depor
23

Lo hago un poco diferente de Mark. Paso todo el dominio y tomo el subdominio en php.

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

Esto ignora las imágenes y asigna todo lo demás a mi archivo index.php. Entonces si voy a

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

Regreso

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

Luego, en mi código index.php, simplemente exploto mi nombre de usuario fuera de hostName. Esto me da buenas y bonitas URL de SEO.

gradbot
fuente
14

Configuramos DNS comodín como se explicó anteriormente. Entonces el registro es * .yourname.com

Entonces, todos los subdominios en realidad van al mismo lugar, pero PHP trata cada subdominio como una cuenta diferente.

Usamos el siguiente código:

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

Este código solo establece la $accountvariable igual que el subdominio. Luego puede recuperar sus archivos y otra información en función de su cuenta.

Probablemente esto no sea tan eficiente como las formas mencionadas anteriormente, pero si no tiene acceso a BIND y / o limitado .htaccess este método debería funcionar (siempre que su host configure el comodín para usted).

De hecho, utilizamos este método para conectarnos a la base de datos de clientes para una aplicación de comercio electrónico multiempresa, pero también puede funcionar para usted.

Volomike
fuente
2
Creo que esta debería ser una respuesta correcta, ya que el operador pregunta sobre cómo PHP maneja los subdominios, NO cómo los servidores web o los servidores DNS tienen subdominios.
Salem
8

No se preocupe con los archivos .htaccess cuando puede usar el alojamiento virtual masivo de Apache .

De la documentación:

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

En cierto modo, es el reverso de su pregunta: cada 'subdominio' es un usuario. Si el usuario no existe, obtienes un 404.

El único inconveniente es que la variable de entorno DOCUMENT_ROOTno está configurada correctamente en el subdirectorio utilizado , sino la raíz_documento predeterminada en de htconfig.

Willem
fuente
1
No estoy realmente seguro de cómo usar eso ... y al final, ¿por qué no estropear htaccess?
Skuta
6

Solución PHP simple para subdominios y aplicaciones web multidominio

Paso 1. Proporcione el registro DNS A como "*" para los dominios (o dominio) que va a servir "example.org"

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

Paso 2. Verifique la falta de inicio de sesión cuando el usuario se registre o cambie el inicio de sesión. Además, evite los puntos en esos inicios de sesión.

Paso 3. Luego verifica la 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 solución puede servir a diferentes dominios.

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

Si necesita las mismas mellas en diferentes dominios atendidos de manera diferente, es posible que deba almacenar la elección del usuario para el dominio al registrar el inicio de sesión.

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

Podría [potencialmente] volver a escribir la URL, pero sí: debe tener el control de su configuración de DNS para que cuando se agregue un usuario obtenga su propio subdominio.

madriguera
fuente
4

Además de los cambios de configuración en su servidor WWW para manejar el nuevo subdominio, su código necesitaría realizar cambios en sus registros DNS. Entonces, a menos que esté ejecutando su propio BIND (o similar), deberá descubrir cómo acceder a la configuración de su proveedor de servidores de nombres. Si no ofrecen algún tipo de API, esto puede ser complicado.

Actualización: sí, consultaría con su registrador si también están proporcionando el servicio del servidor de nombres (como suele ser el caso). Nunca he explorado esta opción antes, pero sospecho que la mayoría de los registradores de consumidores no lo hacen. Busqué en Google las API de GoDaddy y las API de DNS de GoDaddy, pero no pude subir nada, así que supongo que la mejor opción sería consultar la ayuda en línea con su proveedor, y si eso no responde la pregunta, póngase en contacto de su personal de apoyo.

theraccoonbear
fuente
3

Primero, debe asegurarse de que su servidor esté configurado para permitir subdominios comodín. Lo logré en JustHost al crear un subdominio llamado manualmente *. También especifiqué una carpeta llamada subdomainscomo la raíz del documento para los subdominios comodín. Agregue esto a un .htaccessarchivo en su carpeta de subdominios:

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

Finalmente, todo lo que necesita hacer es crear una carpeta en su carpeta de subdominios, luego colocar los archivos del subdominio en ese directorio.

Dan Bray
fuente
3

Esto se puede lograr .htaccesssiempre que su servidor esté configurado para permitir subdominios comodín. Lo logré en JustHost creando un subdominio nombrado manualmente *y especificando una carpeta llamada subdominios como la raíz del documento para los subdominios comodín. Agregue esto a su .htaccessarchivo:

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

Finalmente, cree una carpeta para su subdominio y coloque los archivos de subdominios.

Dan Bray
fuente
1

Solo quería agregar que si usa CloudFlare (gratis), puede usar su API para administrar su DNS con facilidad.

kiwixz
fuente
0

Crear subdominios dinámicos usando PHP y Htaccess

(1) raíz .htaccess

Este archivo es redireccionamiento http://www.yourwebsite.com a http://yourwebsite.com para uso de la página de inicio. Todo el redireccionamiento del subdominio a su carpeta_website

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) Carpeta interior .htaccess

Este archivo está reescribiendo las URL de subdominio.

http://yourwebsite.com/index.php?siteName=9lessons a 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

Más consejos de .htaccess: Tutorial y consejos sobre archivos de Htaccess.

index.php

Este archivo contiene código PHP simple, utilizando expresiones regulares que validan el valor del subdominio.

<?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>

Sin carpeta de subdominio

Si está utilizando el directorio raíz (htdocs / public_html) como directorio del proyecto, use este siguiente archivo .htaccess.

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
fuente