web-dev-qa-db-fra.com

Wildcard sous-domaine pour le même site

Existe-t-il un moyen de charger toutes les demandes d’un sous-domaine sur le même site Web Wordpress, par exemple user1.example.com, user2.example.com et user3.example.com chargent tous le même site Web, mais avec les liens pointant vers le sous-domaine actuel?

J'aimerais conserver le même contenu sur les différents sites Web. La seule différence est qu'en lisant le sous-domaine, je peux proposer un contenu personnalisé (titre de site Web, etc.) spécifiquement à cet utilisateur, ou ajouter un hook pour afficher un message d'erreur si l'utilisateur n'existe pas. Pour le moment, l'installation réseau nécessite que je définisse manuellement chaque site Web, avec des contenus différents.

5
Zahymaka

Dans WordPress, vous pouvez facilement le faire avec des sous-répertoires tels que example.com/user1

Stratégie de sous-domaine et d'URL Avoir username.domain.com vous empêchera à l'avenir d'avoir vos propres sous-domaines comme shop.example.com et vous gênera si vous vouliez utiliser www.example.com ou simplement http://example.com

Enfin ... que faire si un utilisateur veut utiliser des caractères explétifs ou des caractères spéciaux dans son nom d'utilisateur <- pas très bon.

Charge du trafic Les sous-domaines sont analysés (sic) par les serveurs DNS du monde entier pour déterminer comment acheminer le trafic. Si vous souhaitez utiliser plusieurs sous-domaines, cela augmentera également la charge de votre serveur Web Apache, car il essaiera de comprendre quoi faire avec someusername123456789.example.com.

Mais pour faire cela ... vous devriez regarder les scripts, htaccess et les règles de réécriture, puis, cette question est probablement mieux adaptée à un forum différent.

Les sous-répertoires sont faciles avec les paramètres d'URL
C’est sûr de dire que les sous-répertoires sont faciles (pages WordPress Author par exemple) et que WordPress pourra ensuite analyser cela et déterminer quoi faire.

Vous pouvez même utiliser des paramètres d'URL tels que www.example.com/category/?user=username123456789

En résumé - ne faites pas de sous-domaines pour les noms d'utilisateurs, cela peut causer plusieurs maux de tête que vous ne voulez pas.

2
Damien

À mon avis, il semblerait que cela convienne mieux à une installation sur un seul site que sur plusieurs sites. Mais cela dépend vraiment de la façon dont les choses doivent être personnalisées pour un seul utilisateur.

NOTE: cette réponse n'inclura aucune information sur la configuration du serveur, etc.

Tout d'abord, je définirais WP_HOME et WP_SITEURL dans wp-config.php et les rendrais. Vous pouvez probablement les définir de manière dynamique, mais le résultat doit être qu'ils pointent vers le domaine racine principal. Mon installation locale WP est wordpress.dev, je vais donc l'utiliser tout au long de cette réponse.

Exemple:

<?php
// in wp-config.php
define('WP_HOME', 'http://wordpress.dev');
define('WP_SITEURL', WP_HOME . '/wp'); // wp in sub directory

// custom content directory
define('WP_CONTENT_DIR', dirname(__FILE__) . '/content');
define('WP_CONTENT_URL', WP_HOME . '/content');

Ensuite, nous devons définir l'utilisateur en fonction du sous-domaine actuel. Cela devrait être relativement facile: analyser l'hôte HTTP, rechercher un utilisateur par ce nom d'utilisateur, définir cet utilisateur comme utilisateur pour plus tard. Je suggérerais de tout emballer dans une classe (un singleton ici).

<?php
class WPSE66456
{
    // container for an instance of this class
    private static $ins;

    // The current user, based on subdomain.
    private $user = null;

    /***** Singleton Pattern *****/

    public static function init()
    {
        add_action('plugins_loaded', array(__CLASS__, 'instance'), 0);
    }

    public static function instance()
    {
        is_null(self::$ins) && self::$ins = new self;
        return self::$ins;
    }

    /**
     * Constructor.  Actions really get added here.
     *
     */
    protected function __construct()
    {
        // empty for now...
    }
} // end class

Ensuite, nous devons écrire quelque chose pour analyser $_SERVER['HTTP_Host'] et voir si nous obtenons un nom d'utilisateur valide.

<?php
class WPSE66456
{
    // snip snip

    protected function __construct()
    {
        $this->set_current_user($_SERVER['HTTP_Host']);
    }

    protected function set_current_user($Host)
    {
        if(!is_null($this->user))
            return;

        list($user, $Host) = explode('.', $Host, 2);

        // gets tricky here.  Where is the real site? Is it at the root domain?
        // For the purposes of this tutorial, let's assume that we're using a
        // nacked root domain for the main, no user site.

        // Make sure the $Host is still a valid domain, if not we're on the root
        if(strpos($Host, '.') === false)
        {
            $this->user = false;
        }
        else
        {
            if($u = get_user_by('slug', $user))
            {
                // we have a user!
                $this->user = $u;
            }
            else
            {
                // invalid user name.  Send them back to the root.
                wp_redirect("http://{$Host}", 302);
                exit;

                // Or you could die here and show an error...
                // wp_die(__('Invalid User'), __('Invalid User'));
            }
        }
    }
}

Maintenant que vous avez un nom d'utilisateur, vous pouvez faire toutes sortes de choses. Par exemple, modifions le slogan du blog en un message d'accueil pour cet utilisateur.

<?php
class WPSE66456
{
    // snip snip

    protected function __construct()
    {
        $this->set_current_user($_SERVER['HTTP_Host']);
        add_filter('bloginfo', array($this, 'set_tagline'), 10, 2);
    }

    // snip snip

    public function set_tagline($c, $show)
    {
        if('description' != $show || !$this->user)
            return $c;

        return 'Hello, ' . esc_html($this->user->display_name) . '!';
    }
}

En supposant que vous utilisiez l’URL racine (sans www) pour votre installation, WordPress enverra des cookies à tous les domaines. Ainsi, vous pouvez vérifier si un utilisateur affiche son propre sous-domaine et le renvoyer à la racine, sinon.

<?php
class WPSE66456
{
    // snip snip

    protected function __construct()
    {
        $this->set_current_user($_SERVER['HTTP_Host']);
        add_filter('bloginfo', array($this, 'set_tagline'), 10, 2);
        add_action('init', array($this, 'check_user'), 1);
    }

    // snip snip

    public function check_user()
    {
        if($this->user === false || current_user_can('manage_options'));
            return; // on the root domain or the user is an admin

        $user = wp_get_current_user();

        if(!$user || $user != $this->user)
        {
            wp_redirect(home_url());
            exit;
        }
    }
}

Enfin, la dernière chose à prendre en compte serait que WordPress autorise, dans les noms d’utilisateur, les éléments qui ne fonctionneront pas avec le système de noms de domaine. Comme user.one est un nom d'utilisateur valide. Mais user.one.yoursite.com a deux sous-domaines de profondeur et ne va pas au travail.

Vous devrez donc vous accrocher à pre_user_login et désinfecter les choses.

<?php
class WPSE66456
{
    // snip snip

    protected function __construct()
    {
        $this->set_current_user($_SERVER['HTTP_Host']);
        add_filter('bloginfo', array($this, 'set_tagline'), 10, 2);
        add_filter('pre_user_login', array($this, 'filter_login'));
        add_action('init', array($this, 'check_user'), 1);
    }

    // snip snip

    public function filter_login($login)
    {
        // replace anything that isn't a-z and 0-9 and a dash
        $login = preg_replace('/[^a-z0-9-]/u', '', strtolower($login));

        // domains can't begin with a dash
        $login = preg_replace('/^-/u', '', $login);

        // domains can't end with a dash
        $login = preg_replace('/-$/u', '', $login);

        // probably don't want users registering the `www` user name...
        if('www' == $login)
            $login = 'www2';

        return $login;
    }
}

tout ce qui précède comme plugin .

Il y a beaucoup de problèmes qui ne sont pas abordés dans cette réponse. Cette échelle correspond-elle à l'endroit où vous en avez besoin? En quoi le fait d'avoir plusieurs sous-domaines de contenu très similaire aura-t-il un impact sur l'optimisation de la recherche? Combien de contenu est personnalisé? Si c'est beaucoup, le multisite conviendrait-il mieux à cette tâche?

2
chrisguitarguy