Sous-Domaines Génériques

je sais qu'il y a eu quelques fils sur ce sujet avant, mais j'ai essayé absolument tout suggéré (que je pourrais trouver) et rien n'a fonctionné pour moi jusqu'à présent...

Avec cela à l'esprit, ici, c'est ce que j'essaie de faire:

tout d'abord, je veux permettre aux utilisateurs de publier des pages et de leur donner chacun un sous-domaine de leur choix (ex: user.mysite.com). D'après ce que je sais, la meilleure façon de le faire est de cartographier user.mysite.com pour mysite.com/user avec mod_rewrite et .htaccess - est-ce exact?

si c'est exact, quelqu'un peut-il me donner des instructions explicites sur la façon de le faire?

aussi, je fais tout mon développement localement, en utilisant MAMP, donc si quelqu'un pouvait me dire comment configurer mon environnement local pour travailler de la même manière (j'ai lu que c'est plus difficile), je l'apprécierais beaucoup. Honnêtement, j'ai essayé un tout en vain, et depuis c'est ma première fois de faire quelque chose comme cela, je suis complètement perdu. Merci beaucoup pour toute aide!

mise à Jour:certaines de ces réponses ont été vraiment utiles, mais pour le système que j'ai en tête, ajouter manuellement un sous-domaine pour chaque utilisateur n'est pas une option. Ce que je demande vraiment c'est comment faire ça à la volée, et rediriger wildcard.mysite.com pour mysite.com/wildcard la façon dont Tumblr est installé est un parfait exemple de ce que j'aimerais faire. Merci encore!

17
demandé sur beaudeal 2008-09-17 07:48:10

8 réponses

dans la façon de configurer le DNS sous-domaine générique, qui serait fonction de votre fournisseur d'hébergement DNS. Ce serait différentes étapes selon le fournisseur d'hébergement que vous avez et ce serait une meilleure question pour eux.

une fois que vous avez configuré cela avec l'hôte DNS, à partir de votre application web, vous n'êtes vraiment qu'une réécriture D'URL, ce qui peut être fait avec une sorte de module pour le serveur web lui-même, comme la réécriture isapi si vous êtes sur IIS (ce serait la route préférée si possible.) Vous pouvez également gérer la réécriture au niveau de l'application (comme utiliser le routage si on ASP.NET).

Vous auriez réécrire l'URL, donc http://myname.domain.com deviendra http://domain.com/something.aspx?name=myname ou quelque chose. A partir de là, vous le manipulez comme si la valeur de myname était normale dans la chaîne de requête. Cela fait-il sens? J'espère que je n'ai pas mal compris ce que vous cherchez.

Edit:

Je ne suggère pas de créer un sous-domaine pour chaque utilisateur, mais plutôt de créer un sous-domaine pour le domaine lui-même, donc anything.domain.com (essentiellement *.domain.com) goes to your site. J'ai plusieurs domaines de configuration mondomaine. Leurs instructions pour configurer ceci est comme ceci:

Oui, vous pouvez configurer un Joker mais il ne fonctionnera que si vous le configurez comme dossier. Les jokers ne fonctionnent pas avec un C Nom. Pour utiliser un joker, vous utilisez le caractère astéricks'*'. Pour exemple, si vous créez et un enregistrement en utilisant un joker, .domain.com, tout ce qui est entré dans l'endroit où l' '' est situé, permettra de résoudre à l'adresse IP spécifiée. Donc, si vous entrez 'www', 'ftp', 'site', ou autre chose avant le nom de domaine, il résoudra toujours à L'IP adresse

j'en ai quelques-uns qui sont installés de cette façon, ayant *.domain.com aller à mon site. Je peux lire l'URL de base dans mon application web pour voir que ryan.domain.com est que est actuellement accessible, ou que bill.domain.com est ce qui a été utilisé. Je peux alors soit:

  1. utilisez la réécriture D'URL pour que le sous-domaine devienne une partie de la chaîne de requête ou
  2. il suffit de lire la valeur de l'hôte à partir de L'URL consultée et d'effectuer une logique basée sur cette valeur.

cela Fait-il sens? J'ai plusieurs sites en cette manière exacte: créer le Joker pour le domaine avec l'hôte DNS et ensuite simplement lire l'hôte, ou le domaine de base à partir de L'URL pour décider quoi afficher basé sur le sous-domaine (qui était en fait un nom d'utilisateur)

Edit 2:

il n'y a aucun moyen de faire cela sans une entrée DNS. Le "monde en ligne" a besoin de savoir que name1.domain.com, name2.domain.com,...,nameN.domain.com tous aller à l'adresse IP de votre serveur. La seule façon de le faire est avec le DNS entrée. Vous devez ajouter le Joker DNS pour votre domaine avec votre hôte DNS. Ensuite, il s'agit simplement de lire le sous-domaine à partir de L'URL et de prendre les mesures appropriées dans votre code.

16
répondu Ryan Farley 2008-09-17 16:53:47

la meilleure chose à faire si vous exécutez *AMP est de faire ce que Thomas suggère et de faire les hôtes virtuels dans Apache. Vous pouvez le faire soit avec ou sans la redirection que vous décrivez.

serveurs Virtuels

très probablement, vous voulez faire serveurs virtuels basés sur les noms, car il est plus facile à configurer et ne nécessite qu'une seule adresse IP (il sera donc aussi facile à configurer et à tester sur votre machine MAMP locale). Les serveurs virtuels basés sur IP sont meilleurs à d'autres égards, mais vous avoir une adresse IP pour chaque domaine.

page de Wikipédia discute les différences et les liens vers un bon walk-thru de base de la façon de faire des vhosts basés sur le nom au bas.

sur votre machine locale pour tester, vous devrez également configurer de faux noms DNS dans /etc/hosts pour vos faux noms de domaines de test. i.e. si vous avez Apache écoutant sur localhost et configurer vhost1.test.domaine et vhost2.test.domaine dans votre Apache configs, vous n'avez qu'à ajouter ces domaines vers la ligne 127.0.0.1 dans /etc/ hosts, après localhost:

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

une fois que vous avez édité le fichier /etc/hosts et ajouté les configurations d'hôte virtuel basées sur le nom à votre(S) fichier (s) de configuration Apache, c'est tout, redémarrez Apache et vos domaines de test devraient fonctionner.

Redirection avec le mod_rewrite

si vous voulez faire des redirections avec mod_rewrite (de sorte que user.example.com n'est pas directement hébergé et redirige plutôt vers example.com/user), alors vous aurez également besoin de faire une directive RewriteCond pour correspondre le sous-domaine et redirection:

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

Vous pouvez mettre ceci dans un .htaccess ou dans votre configuration Apache principale.

Vous aurez besoin d'ajouter une paire de règles comme les deux dernières pour chaque sous-domaine que vous souhaitez rediriger. Ou, vous pouvez être en mesure de capturer le sous-domaine dans une directive RewriteCond pour pouvoir utiliser une règle de Joker pour rediriger *.example.com pour example.com/ * -- mais ça sent vraiment mauvais pour moi du point de vue de la sécurité.

Tous ensemble, vhosts et rediriger

il est préférable d'être plus explicite et de configurer une section de configuration d'hôte virtuel pour chaque nom d'hôte que vous voulez écouter, et de mettre les règles de réécriture pour chacun de ces noms d'hôte dans sa configuration d'hôte virtuel. (Il est toujours plus sûr et plus rapide de mettre ce genre de choses dans votre config Apache et non .htaccess, si vous pouvez l'aider -- .htaccess ralentit les performances car Apache recherche constamment le système de fichiers .fichiers htaccess et leur réparation, et c'est moins sûr parce que ça peut être foiré par les utilisateurs.)

tous ensemble comme ça, la config vhost à l'intérieur de votre Apache configs serait:

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 [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 [R]
</VirtualHost>
13
répondu joelhardi 2008-09-17 05:03:48

je me rends compte que je suis assez en retard pour répondre à cette question, mais j'ai eu le même problème en ce qui concerne une solution de développement local. un autre fil j'ai trouvé de meilleures solutions et j'ai pensé que je les partagerais pour quiconque ayant la même question à l'avenir:

VMware possède le domaine wild card qui résout n'importe quel sous-domaine à 127.0.0.1:

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

ou pour plus de polyvalence 37 signaux possède un domaine pour mapper n'importe quel sous-domaine à N'importe quelle IP en utilisant un format spécifique:

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

xip.io pour plus d'info

7
répondu Beau 2017-05-23 12:17:21

Je suis sur Ubuntu 16.04 et depuis 14.04 j'utilise la solution fournie par Dave Evans ici et ça marche très bien pour moi.

  1. Installer dnsmasq

    sudo apt-get install dnsmasq
    
  2. Créer un nouveau fichier localhost.conf/etc/dnsmasq.d dir avec la ligne suivante

    #file /etc/dnsmasq.d/localhost.conf
    address=/localhost/127.0.0.1
    
  3. Modifier /etc/dhcp/dhclient.conf et ajoutez la ligne suivante

    prepend domain-name-servers 127.0.0.1;
    

    (Vous trouverez probablement que cette ligne est déjà là et vous venez de faut décommenter.)

  4. le dernier est de redémarrer le service

    sudo systemctl restart dnsmasq
    sudo dhclient
    

enfin, vous devriez vérifier si ça marche.

dig whatever.localhost

remarque:

Si vous souhaitez l'utiliser sur votre serveur web, vous devez simplement modifier le 127.0.0.0 à votre adresse IP actuelle.

3
répondu Fery Wardiyanto 2016-12-03 09:15:11

j'ai dû faire exactement la même chose pour un de mes sites. Vous pouvez suivre les étapes suivantes

  1. Si vous avez cPanel sur votre serveur, créez un sous-domaine * si non, vous devez configurer Un enregistrement DNS (BIND voir http://ma.tt/2003/10/wildcard-dns-and-sub-domains/). Sur votre dev. serveur vous seriez bien mieux de simuler des sous-domaines en ajoutant chacun à votre hosts fichier.

  2. (Si vous avez utilisé cPanel vous n'aurez pas à ce faire). Vous devrez ajouter quelque chose comme ceci à votre fichier apache vhosts. Cela dépend en grande partie du type de serveur (partagé ou non) que vous utilisez. LE CODE SUIVANT N'EST PAS COMPLET. C'EST JUSTE POUR DONNER LA DIRECTION. REMARQUE: ServerAlias example.com *.example.com est important.

    <VirtualHost 127.0.0.1:80>  
            DocumentRoot /var/www/  
            ServerName example.com  
            ServerAlias example.com *.example.com  
    </VirtualHost>
    
  3. suivant, puisque vous pouvez utiliser le script PHP pour vérifier l'en-tête "Host" et trouver le sous-domaine et servir le contenu en conséquence.

1
répondu Arvind Gupta 2010-08-02 01:45:54

vous pouvez être mieux en utilisant serveurs virtuels. De cette façon, chaque utilisateur peut avoir une configuration de serveur web à peu près indépendante des autres.

La syntaxe va quelque chose comme ceci:

<VirtualHost *:80>
    DocumentRoot /var/www/user
    ServerName user.mysite.com
    ...
</VirtualHost>
0
répondu Thomas 2008-09-17 03:54:31

De ce que j'ai vu sur de nombreux hébergeurs, ils la configuration d'un hôte virtuel apache.

Donc, si votre www.mysite.com est servi à partir de /var/www, vous pouvez créer un dossier pour chaque utilisateur. Puis mappez l'hôte virtuel dans ce dossier.

avec cela, les deux mysite.com/user et user.mysite.com travaux.

en ce qui concerne votre environnement de test, si vous êtes sur windows, je vous suggérerais d'éditer votre fichier HOSTS pour map mysite.com à votre PC local (127.0.0.1), ainsi qu'à tout sous-domaine vous mettre en place pour les tests.

0
répondu Scott Swezey 2008-09-17 04:09:33

la solution que J'ai trouvée pour Ubuntu 18.04 est similaire à celui-ci mais implique NetworkManager config:

  1. éditer le fichier /etc/NetworkManager/NetworkManager.conf, et ajouter la ligne dns=dnsmasq[main]

    sudo editor /etc/NetworkManager/NetworkManager.conf
    

    devrait ressembler à ceci:

    [main]
    plugins=ifupdown,keyfile
    dns=dnsmasq
    ...
    
  2. utilisez la resolv de NetworkManager.conf

    sudo rm /etc/resolv.conf
    sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
    
  3. Créer un fichier avec votre générique configuration

    echo 'address=/.localhost/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/localhost-wildcard.conf
    
  4. Recharger NetworkManager configuration

    sudo systemctl reload NetworkManager
    
  5. Test

    dig localdomain.localhost
    

vous pouvez également ajouter n'importe quel autre domaine, très utile pour certains types d'authentification lors de l'utilisation d'une configuration de développement local.

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

Ensuite cela fonctionne:

dig petproject.local-dev.workdomain.com

;; ANSWER SECTION:
petproject.local-dev.workdomain.com. 0 IN   A   127.0.0.1
0
répondu Nicolay77 2018-08-21 13:02:17