Subdomínio de curinga para o mesmo site

5

Existe alguma maneira de fazer com que todas as solicitações para qualquer subdomínio carreguem o mesmo site do Wordpress, por exemplo? user1.example.com, user2.example.com e user3.example.com todos carregam o mesmo site, mas com os links apontando para o subdomínio atual?

Gostaria de manter principalmente o mesmo conteúdo nos diferentes sites. A única diferença é que, ao ler o subdomínio, posso oferecer conteúdo personalizado (título do site, etc.) especificamente para esse usuário ou adicionar um gancho para exibir uma mensagem de erro se o usuário não existir. No momento em que a instalação na rede requer que eu defina manualmente todos os sites, com diferentes conteúdos entre eles.

    
por Zahymaka 27.09.2012 / 17:28

2 respostas

2

No WordPress você pode facilmente fazer isso com subdiretórios como example.com/user1

Subdomínio & Estratégia de URL Ter username.domain.com impedirá que você, no futuro, tenha seus próprios subdomínios, como shop.example.com , e prejudicará você se quiser usar www.example.com ou apenas http://example.com

Finalmente ... e se algum usuário quiser usar expletivos ou caracteres especiais em seu nome de usuário < - não muito bom.

Carga de tráfego Subdomínios são analisados (sic) por servidores DNS em todo o mundo para descobrir como rotear o tráfego. Se você quiser usar muitos subdomínios, isso também aumentará a carga no seu servidor web Apache enquanto tenta descobrir o que fazer com someusername123456789.example.com

Mas para fazer isso ... você precisaria ver scripts, acessar e reescrever as regras e, então, essa questão provavelmente é mais adequada para um fórum diferente.

Os subdiretórios são fáceis, juntamente com os parâmetros de URL
É seguro dizer que sub-direcotries são fáceis (WordPress Author páginas como exemplo) e, em seguida, o WordPress pode analisar isso e determinar o que fazer.

Você pode até usar parâmetros de URL, como www.example.com/category/?user=username123456789

Em resumo - não use subdomínios para nomes de usuário, isso pode causar várias dores de cabeça que você não deseja.

    
por Damien 03.10.2012 / 21:57
2

Para mim, parece que isso pode ser algo mais adequado para uma instalação de site único vs. multi site. Mas isso realmente depende de como as coisas personalizadas precisam ser para um único usuário.

OBSERVAÇÃO: esta resposta não incluirá informações sobre a configuração do servidor, etc.

Primeiramente, eu definiria WP_HOME e WP_SITEURL em wp-config.php e os tornaria imutáveis. Provavelmente, você pode configurá-los dinamicamente, mas os resultados precisam ser que eles apontem para o domínio raiz principal. Minha instalação local do WP é wordpress.dev , então usarei isso ao longo desta resposta.

Exemplo:

<?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');

Em seguida, precisamos definir o usuário com base no subdomínio atual. Isso deve ser relativamente fácil: analisar o host HTTP, procurar um usuário com esse nome de usuário e configurar esse usuário como usuário para mais tarde. Sugiro envolver tudo em uma aula (um singleton aqui).

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

Em seguida, precisamos escrever algo para analisar $_SERVER['HTTP_HOST'] e ver se obtemos um nome de usuário válido dele.

<?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'));
            }
        }
    }
}

Agora que você tem um nome de usuário, pode fazer todo tipo de coisa. Como exemplo, vamos alterar o slogan do blog para uma saudação para esse usuário.

<?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) . '!';
    }
}

Supondo que você use a raiz, a URL nua (sem www) para a sua instalação, o WordPress enviará cookies para todos os sudomains. Assim, você pode verificar se um usuário está visualizando seu próprio subdomínio e lançá-lo de volta à raiz, caso contrário.

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

Finalmente, a última coisa a considerar seria que o WordPress permite coisas em nomes de usuários que não funcionem com o sistema de nomes de domínio. Como user.one é um nome de usuário válido. Mas user.one.yoursite.com tem dois subdomínios e não vai funcionar.

Então você precisa se conectar a pre_user_login e higienizar as coisas.

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

todos os itens acima como plugin .

Existem muitas preocupações que não são abordadas nesta resposta. Isso escala para onde você precisa escalar? Como ter vários subdomínios de conteúdo muito semelhante afeta a otimização de pesquisa? Quanto conteúdo é personalizado? Se for muito, o multi-site seria mais adequado para essa tarefa?

    
por chrisguitarguy 04.10.2012 / 01:17