Pregunta

Sé que ha habido algunos hilos sobre esto antes, pero probé absolutamente todo lo sugerido (que pude encontrar) y nada me ha funcionado hasta ahora...

Con eso en mente, esto es lo que estoy tratando de hacer:

Primero, quiero permitir a los usuarios publicar páginas y darles a cada uno un subdominio de su elección (por ejemplo:usuario.misitio.com).Por lo que puedo deducir, la mejor manera de hacerlo es asignar user.mysite.com a mysite.com/user con mod_rewrite y .htaccess. ¿Es correcto?

Si eso es correcto, ¿alguien puede darme instrucciones explícitas sobre cómo hacerlo?

Además, estoy haciendo todo mi desarrollo localmente, usando MAMP, por lo que si alguien pudiera decirme cómo configurar mi entorno local para que funcione de la misma manera (he leído que esto es más difícil), se lo agradecería mucho.Honestamente, he estado intentando todo sin éxito y como es la primera vez que hago algo como esto, estoy completamente perdido.¡Muchas gracias por cualquier ayuda!

Actualizar: Algunas de estas respuestas han sido REALMENTE útiles, pero para el sistema que tengo en mente, agregar manualmente un subdominio para cada usuario no es una opción.Lo que realmente estoy preguntando es cómo hacer esto sobre la marcha y redirigir wildcard.mysite.com a mysite.com/wildcard; la forma en que está configurado Tumblr es un ejemplo perfecto de lo que me gustaría hacer.¡Gracias de nuevo!

¿Fue útil?

Solución

En cuanto a cómo configurar el comodín del subdominio DNS, eso sería una función de su proveedor de alojamiento DNS.Estos serían pasos diferentes según el proveedor de alojamiento que tenga y sería una mejor pregunta para ellos.

Una vez que haya configurado eso con el host DNS, desde su aplicación web simplemente estará reescribiendo la URL, lo que se puede hacer con algún tipo de módulo para el servidor web, como la reescritura isapi si está en IIS (esto sería la ruta preferida si es posible).También puede manejar la reescritura a nivel de aplicación (como usar enrutamiento si está en ASP.NET).

Reescribirías la URL para que http://minombre.dominio.com se convertiría http://dominio.com/algo.aspx?nombre=minombre o algo.De ahí en adelante, simplemente manéjelo como si el valor myname estuviera en la cadena de consulta como de costumbre.¿Tiene sentido?Espero no haber entendido mal lo que buscas.

Editar:

No estoy sugiriendo que cree un subdominio para cada usuario, sino que cree un subdominio comodín para el dominio en sí, de modo que cualquier cosa.dominio.com (básicamente *.dominio.com) va a su sitio.Tengo varios dominios configurados con mi dominio.Sus instrucciones para configurar esto son las siguientes:

Sí, puede configurar un comodín, pero solo funcionará si lo configura como un registro A.Los comodines no funcionan con un nombre C.Para usar un comodín, usa el personaje de Astericks '*'.Por ejemplo, si crea y un registro usando un comodín, .domain.com, cualquier cosa que se ingrese en el lugar donde el ''se encuentra, se resolverá a la dirección IP especificada.Entonces, si ingresa 'www', 'ftp', 'sitio' o cualquier otra cosa antes del nombre de dominio, siempre se resolverá a la dirección IP

Tengo algunos que están configurados de esta manera, haciendo que *.domain.com vaya a mi sitio.Luego puedo leer la URL base en mi aplicación web para ver que ryan.domain.com es lo que se accedió actualmente, o que bill.domain.com es lo que se usó.Entonces puedo:

  1. Utilice la reescritura de URL para que el subdominio pase a formar parte de la cadena de consulta O
  2. Simplemente lea el valor del host de la URL a la que se accede y realice alguna lógica basada en ese valor.

¿Tiene sentido?Tengo varios sitios configurados exactamente de esta manera:cree el comodín para el dominio con el host DNS y luego simplemente lea el host o dominio base de la URL para decidir qué mostrar según el subdominio (que en realidad era un nombre de usuario)

Edición 2:

No hay manera de hacer esto sin una entrada DNS.El "mundo en línea" necesita saber que nombre1.dominio.com, nombre2.dominio.com,...,nombreN.dominio.com van todos a la dirección IP de su servidor.La única forma de hacerlo es con la entrada DNS adecuada.Debe agregar la entrada DNS comodín para su dominio con su host DNS.Entonces sólo es cuestión de que leas el subdominio de la URL y realices la acción adecuada en tu código.

Otros consejos

Lo mejor que puede hacer si está ejecutando *AMP es hacer lo que sugiere Thomas y utilizar hosts virtuales en Apache.Puedes hacer esto con o sin la redirección que describe.

anfitriones virtuales

Lo más probable es que quieras hacer hosts virtuales basados ​​en nombres, ya que es más fácil de configurar y solo requiere una dirección IP (por lo que también será fácil de configurar y probar en su máquina MAMP local).Los hosts virtuales basados ​​en IP son mejores en algunos otros aspectos, pero es necesario tener una dirección IP para cada dominio.

Este página de wikipedia analiza las diferencias y enlaces a un buen tutorial básico sobre cómo hacer vhosts basados ​​en nombres en la parte inferior.

En su máquina local para realizar pruebas, también deberá configurar nombres DNS falsos en /etc/hosts para sus nombres de dominio de prueba falsos.es decir.Si tiene Apache escuchando en localhost y configura vhost1.test.domain y vhost2.test.domain en sus configuraciones de Apache, simplemente agregará estos dominios a la línea 127.0.0.1 en /etc/hosts, después de localhost:

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

Una vez que haya realizado la edición de /etc/hosts y haya agregado las configuraciones de host virtual basadas en nombres a su(s) archivo(s) de configuración de Apache, eso es todo, reinicie Apache y sus dominios de prueba deberían funcionar.

Redirigir con mod_rewrite

Si desea realizar redirecciones con mod_rewrite (para que user.example.com no esté alojado directamente y en su lugar redirija a example.com/user), también deberá realizar una RewriteCond para que coincida con el subdominio y redirigirlo:

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

Puedes poner esto en un .htaccess o en tu configuración principal de Apache.

Deberá agregar un par de reglas como las dos últimas para cada subdominio que desee redirigir.O bien, es posible que pueda capturar el subdominio en un rewriteCond para poder usar una regla comodín para redirigir * .example.com a ejemplo.com/ *, pero eso me huele muy mal desde un punto de vista de seguridad.

Todos juntos, vhosts y redirección.

Es mejor ser más explícito y configurar una sección de configuración de host virtual para cada nombre de host que desee escuchar y colocar las reglas de reescritura para cada uno de estos nombres de host dentro de su configuración de host virtual.(Siempre es más seguro y rápido colocar este tipo de cosas dentro de su configuración de Apache y no .htaccess, si puede evitarlo; .htaccess ralentiza el rendimiento porque Apache busca constantemente en el sistema de archivos archivos .htaccess y los analiza, y es menos seguro porque los usuarios pueden estropearlos).

Todo junto así, la configuración de vhost dentro de sus configuraciones de Apache sería:

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>

Me doy cuenta de que llegué bastante tarde a responder a esta pregunta, pero tuve el mismo problema con respecto a una solución de desarrollo local.En otro hilo SO Encontré mejores soluciones y pensé en compartirlas con cualquiera que tenga la misma pregunta en el futuro:

Dominio comodín propiedad de VMware que resuelve cualquier subdominio en 127.0.0.1:

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

o para mayor versatilidad, 37 Signals posee un dominio para asignar cualquier subdominio a cualquier IP determinada utilizando un 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 más información

Estoy en Ubuntu 16.04 y desde 14.04 uso la solución proporcionada por Dave Evans aquí y me funciona bien.

  1. Instalar dnsmasq

    sudo apt-get install dnsmasq
    
  2. Crear nuevo archivo localhost.conf bajo /etc/dnsmasq.d dir con la siguiente línea

    #file /etc/dnsmasq.d/localhost.conf
    address=/localhost/127.0.0.1
    
  3. Editar /etc/dhcp/dhclient.conf y agrega la siguiente línea

    prepend domain-name-servers 127.0.0.1;
    

    (Probablemente encontrará que esta línea ya está allí y sólo necesita descomentarla).

  4. El último es reiniciar el servicio.

    sudo systemctl restart dnsmasq
    sudo dhclient
    

Finalmente, debes comprobar si está funcionando.

dig whatever.localhost

nota:

Si desea utilizarlo en su servidor web, simplemente debe cambiar el 127.0.0.0 a su dirección IP real.

Tuve que hacer exactamente lo mismo para uno de mis sitios.Puedes seguir los siguientes pasos

  1. Si tienes cPanel en tu servidor, crea un subdominio *, si no, tendrías que configurar un registro A en tu DNS (para BIND, consulta http://ma.tt/2003/10/wildcard-dns-and-sub-domains/).En tu desarrollador.servidor, sería mucho mejor falsificar subdominios agregando cada uno a su hosts archivo.

  2. (Si usaste cPanel no tendrás que hacer esto).Tendrás que agregar algo como lo siguiente a tu archivo apache vhosts.Depende en gran medida del tipo de servidor (compartido o no) que esté ejecutando.EL SIGUIENTE CÓDIGO NO ESTÁ COMPLETO.ES SÓLO PARA DAR DIRECCIÓN.NOTA: ServerAlias example.com *.example.com es importante.

    <VirtualHost 127.0.0.1:80>  
            DocumentRoot /var/www/  
            ServerName example.com  
            ServerAlias example.com *.example.com  
    </VirtualHost>
    
  3. A continuación, puede utilizar el script PHP para comprobar el encabezado "Host" y encontrar el subdominio y ofrecer el contenido correspondiente.

Primero, quiero permitir a los usuarios publicar páginas y darles a cada uno un subdominio de su elección (Ej:usuario.misitio.com).Por lo que puedo reunir, la mejor manera de hacerlo es asignar user.mysite.com a mysite.com/user con mod_rewrite y .htaccess, ¿es correcto?

Quizás sea mejor que uses anfitriones virtuales.De esta forma, cada usuario puede tener una configuración de servidor web prácticamente independiente de los demás.

La sintaxis es algo como esto:

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

Por lo que he visto en muchos servidores web, configuran un servidor virtual en Apache.

Entonces, si su www.mysite.com se sirve desde /var/www, puede crear una carpeta para cada usuario.Luego asigne el host virtual a esa carpeta.

Con eso, tanto mysite.com/user como user.mysite.com funcionan.

En cuanto a su entorno de prueba, si está en Windows, le sugeriría editar su archivo HOSTS para asignar mysite.com a su PC local (127.0.0.1), así como a cualquier subdominio que haya configurado para la prueba.

La solución que encontré para Ubuntu 18.04 es similar a Éste pero implica la configuración de NetworkManager:

  1. Editar el archivo /etc/NetworkManager/NetworkManager.conf, y agrega la línea dns=dnsmasq hacia [main] sección

    sudo editor /etc/NetworkManager/NetworkManager.conf
    

    debería verse así:

    [main]
    plugins=ifupdown,keyfile
    dns=dnsmasq
    ...
    
  2. Comience a usar resolv.conf de NetworkManager

    sudo rm /etc/resolv.conf
    sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
    
  3. Crea un archivo con tu configuración comodín

    echo 'address=/.localhost/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/localhost-wildcard.conf
    
  4. Vuelva a cargar la configuración de NetworkManager

    sudo systemctl reload NetworkManager
    
  5. Pruébalo

    dig localdomain.localhost
    

También puedes agregar cualquier otro dominio, lo cual es bastante útil para algunos tipos de autenticación cuando se utiliza una configuración de desarrollo local.

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

Entonces esto funciona:

dig petproject.local-dev.workdomain.com

;; ANSWER SECTION:
petproject.local-dev.workdomain.com. 0 IN   A   127.0.0.1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top