同一站点的通配符子域

时间:2012-09-27 作者:Zahymaka

是否有任何方法可以使对任何子域的所有请求加载相同的Wordpress网站,例如user1。实例com,用户2。实例com和user3。实例com都加载相同的网站,但链接指向当前子域?

我想在不同的网站上保留大致相同的内容。唯一的区别是,通过阅读子域,我可以专门为该用户提供定制内容(网站标题等),或者如果该用户不存在,则添加一个挂钩以显示错误消息。目前,网络安装需要我手动定义每个网站,其中包含不同的内容。

2 个回复
SO网友:Damien

在WordPress中,您可以通过以下子目录轻松完成此操作example.com/user1

Sub-domain & URL Strategy拥有username.domain.com 将阻止您将来拥有自己的子域,如shop.example.com 如果你想使用www.example.com 或者只是http://example.com

最后如果一些用户想在用户名中使用咒语或特殊字符,该怎么办<;--不太好。

Traffic Load世界各地的DNS服务器对子域进行分析(sic),以找出如何路由流量。如果您想使用许多子域,这也会增加Apache web服务器的负载,因为它试图找出如何处理someusername123456789.example.com

但要做到这一点。。。您需要查看脚本、htaccess和重写规则,然后,这个问题可能更适合不同的论坛。

Sub-directories are easy along with URL parameters<可以肯定地说,次级目录很容易(例如WordPress的作者页面),然后WordPress可以对此进行分析并确定要做什么。

您甚至可以使用URL参数,如www.example.com/category/?user=username123456789

总而言之,不要为用户名设置子域,这可能会导致您不想要的多个头痛问题。

SO网友:chrisguitarguy

对我来说,这听起来可能更适合单站点安装而不是多站点安装。但这实际上取决于单个用户需要如何定制。

NOTE: this answer will not include information about server setup, etc.

首先,我将在中定义WP\\u HOME和WP\\u SITEURLwp-config.php 让它们保持不变。您可能可以动态地设置这些,但结果必须是它们指向主根域。我的本地WP安装是wordpress.dev, 所以我将在整个回答中使用它。

示例:

<?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\');
接下来,我们需要根据当前子域设置用户。这应该相对容易:解析HTTP主机,通过该用户名查找用户,将该用户设置为以后的用户。我建议将所有内容都打包在一个类中(这里是一个单独的类)。

<?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
然后我们需要写一些东西来解析$_SERVER[\'HTTP_HOST\'] 看看我们是否从中获得了有效的用户名。

<?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\'));
            }
        }
    }
}
现在你有了用户名,你可以做各种事情了。作为一个例子,让我们将博客标语改为该用户的问候语。

<?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) . \'!\';
    }
}
假设您使用根、裸(无www)url进行安装,WordPress将向所有sudomains发送Cookie。因此,您可以检查用户是否正在查看自己的子域,然后将其返回到根目录,否则。

<?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;
        }
    }
}
最后,要考虑的最后一件事是WordPress允许在用户名中使用与域名系统不兼容的内容。喜欢user.one 是有效的用户名。但是user.one.yoursite.com 有两个子域很深,不起作用。

所以你需要pre_user_login 并清理东西。

<?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;
    }
}
以上所有内容均为plugin.

这个答案中有很多问题没有解决。这个是否可以扩展到需要扩展的地方?拥有多个内容非常相似的子域会如何影响搜索优化?定制了多少内容?如果数量很多,多站点是否更适合此任务?

结束

相关推荐

BackPress-我需要加载哪些库才能与MultiSite一起工作?

我已经成功安装并运行了这些基于BackPress的项目。支持按:https://supportpress.svn.wordpress.org/trunk/ </地应力:http://geopress.my/我试图了解如何构建一些需要多站点功能和子域选项的自定义项目。有人知道怎么做吗?我必须加载哪些库?非常感谢!