web-dev-qa-db-ja.com

同じサイトのワイルドカードサブドメイン

任意のサブドメインへのすべての要求に同じWordpress Webサイトをロードさせる方法はありますか。 user1.example.com、user2.example.com、およびuser3.example.comはすべて同じWebサイトを読み込みますが、リンクは現在のサブドメインを指していますか。

私は、異なるWebサイトでもほぼ同じコンテンツを維持したいと思います。唯一の違いは、サブドメインを読むことで、そのユーザーに特化したカスタマイズされたコンテンツ(Webサイトのタイトルなど)を提供できること、またはユーザーが存在しない場合はエラーメッセージを表示するフックを追加できることです。現時点では、ネットワークをインストールするために、すべてのWebサイトを手動で定義し、それらのコンテンツを異なるものにする必要があります。

5
Zahymaka

WordPressでは、example.com/user1のようなサブディレクトリでこれを簡単に行うことができます。

サブドメインとURLの戦略 username.domain.comを持つことで、将来的にはshop.example.comのような独自のサブドメインを持つことができなくなり、www.example.comまたは単にhttp://example.comを使いたい場合に悩むことになります

最後に...あるユーザが自分のユーザ名に特殊文字や特殊文字を使用したい場合はどうします< - あまり良くありません。

トラフィック負荷 サブドメインは、トラフィックのルーティング方法を把握するために世界中のDNSサーバーによって分析されます。多数のサブドメインを使用したい場合は、someusername123456789.example.comを使用して何をすべきかを判断しようとするため、Apache Webサーバーの負荷も増加します。

しかし、これを行うには、スクリプト、htaccess、およびルールの書き換えを確認する必要があります。その場合、この質問はおそらく別のフォーラムに適しています。

サブディレクトリはURLパラメータと一緒に簡単です
サブディレクトリは簡単だと言っても安全であり(例としてWordPress Authorページ)、WordPressがこれを分析して対処方法を決定できます。

www.example.com/category/?user=username123456789のようなURLパラメータも使えます

要約すると、ユーザー名のサブドメインを作成しないでください。複数の頭痛がしたくない場合があります。

2
Damien

私には、これは単一サイトのインストールと複数サイトのどちらに適しているかのように思えます。しかし、それは本当にカスタマイズされたものがどのように単一のユーザーのために必要であるかに依存します。

注:この回答には、サーバーの設定などに関する情報は含まれません。

最初に、WP_HOMEとWP_SITEURLをwp-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は全てのドメインにクッキーを送ります。それで、あなたは、ユーザーが自分のサブドメインを見ているかどうかを確認し、そうでなければルートに投げることができます。

<?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は2つのサブドメインの深さであり、うまくいきません。

そのため、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 として上記のすべて。

この答えで対処されていない多くの懸念があります。これはあなたがそれを拡大縮小するのに必要な場所に拡大縮小しますか?非常によく似たコンテンツの複数のサブドメインを持つことは、検索の最適化にどのように影響しますか?カスタマイズされたコンテンツの量それが多い場合は、マルチサイトがこのタスクに適していますか?

2
chrisguitarguy