web-dev-qa-db-ja.com

マルチサイト:サブドメインモードとサブディレクトリモードの違いインストール後に切り替えることはできますか?

WordPressのマルチサイト機能には、2つの異なるインストールモードがあります。 subdomain および subdirectory install。デフォルトでは、どちらのモードでも1つのインストール内と1つのプライマリドメイン内で別々のWordPressインスタンス(サイト)を管理できます。明らかな違いは、すべてのサイトのURLスキーマです(この例では、multisite.tldが主要なドキュメントです)。

  • サブドメインインストール用のhttp://site1.multisite.tld
  • サブディレクトリインストール用のhttp://multisite.tld/site1

任意のドメインをサイトにマッピングすることは可能です 両方のモードで作成された後に - 、両者の実際の違いは何でしょうか。また、インストール後にモードを変更する方法はありますか?

4
David

ユーザーから見ると、2つの大きな違いがあります。まず新しいサイトを作成するためのGUI。 URLパス(サブディレクトリ)のfirst segmentの入力フィールド、または新しいサイトに使用するサブドメインの入力フィールドのどちらかが表示されます。 (URLを完全に任意の値に設定することは、既に作成されたサイトを編集するときにだけ可能です。しかし、それは両方のモードで可能です。)

もう1つは、一見したところでは明らかではなく、サブディレクトリモードにのみ影響します。メインサイトのパーマリンク構造は、変更されることを意図していない静的プレフィックスblog/を持ちます。 (解決策があるかもしれないのにプレフィックスを変更するか、または取り除きなさい)。

技術的な観点からは、構成定数、データベース内の構成値、およびWebサーバーの構成によって定義されるシステム構成は異なります。最初にモードを定義するものは、true(サブドメインモード)またはfalse(サブディレクトリモード)に設定できる定数IS_SUBDOMAIN_INSTALLです。しかし、それがこの情報が保存される唯一の場所ではありません。インストール処理中、WordPressはキーsubdomain_installを使ってサイトメタとして整数値を保存します。それはWP-CLIで読むことができます(または更新することができます):

$ wp site option get subdomain_install
1

サブディレクトリモードでは、さらに禁止されたサイトスラッグのリストに追加の要素が追加されます:blog。これらのリストはサイトメタillegal_namesに格納されています。したがって、サブディレクトリモードでは、デフォルトで次のようになります。

$ wp site option get illegal_names
array (
      0 => 'www',
      1 => 'web',
      2 => 'root',
      3 => 'admin',
      4 => 'main',
      5 => 'invite',
      6 => 'administrator',
      7 => 'files',
      8 => 'blog',
)

Apacheの書き換え設定

WebサーバはWordPressの内部構造を担当していないため、その設定はすべて、要求されたURLを正しいスクリプトまたはアセットファイルにルーティングすることです。主に、/site-slug/wp-[admin|content|includes]/site-slug/wp-*.phpのようなリクエストURLを適切なディレクトリ(/wp-*/)に送るのか、スクリプトに送るのかという問題です。

そのため、 サブディレクトリモード のデフォルトの書き換え規則は次のようになります。

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

これに対して、 サブドメインモード の設定が推奨されます。

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]

どのタイプのルールセットを使用するかは、マルチサイト用に計画しているドメインスキーマによって大きく異なります。より柔軟なものはもちろん最初のもの(サブディレクトリ)です。URLパスセグメント("サブディレクトリ")は完全にオプションです

Sunrising(WordPressルーティング)とis_subdomain_install() API関数

どのモードが設定されているかを知るために、WordPressは以下の場合にtrueを返す関数is_subdomain_install()を提供しています。

  • 定数SUBDOMAIN_INSTALLが定義され、true または に設定されている
  • 定数SUBDOMAIN_INSTALLは定義されていませんがVHOSTが定義されていて'yes'に設定されています

SUBDOMAIN_INSTALLが定義されていてfalseに設定されている場合はfalseを返します。 SUBDOMAIN_INSTALLが定義されているがboolean型ではない場合、それ以外のものを返します。上記のサイトメタ値は、マルチセットアップのプロセス中にのみ使用されます。 WordPressコアは、この定数の他の部分の値にのみ依存しています。

ただし、is_subdomain_install()の値は、定数DOMAIN_CURRENT_SITEおよびPATH_CURRENT_SITEが定義されていない場合にのみ、要求されたURLのネットワーク内の特定のサイトへのルーティングに影響します。 (ms_load_current_site_and_network()を参照)つまり、両方のモードでドメインURLをサイトURLとして使用できます(ドメインマッピング)。

セットアップ後のモード切り替え

フォームサブドメインをサブディレクトリモードに切り替える

  • 定数IS_SUBDOMAIN_INSTALLの値をtrueからfalseに変更します
  • サイトメタsubdomain_installの値を0に設定します。

    $wp site option set subdomain_install 0

  • メインサイトのパーマリンク構造に接頭辞/blog/を追加してください。設定が更新された後に修正されます。
  • 禁止されたサイトスラッグのリストにblogを追加してください。このリストは直列化された値なので、これはWP-CLI経由で実行できる小さなPHPスクリプトを介して実行する必要があります。

$ wp eval-file patch-forbidden-slugs.php

// patch-forbidden-slugs.php
<?php
$illegalNames = get_metadata( 'site', SITE_ID_CURRENT_SITE, 'illegal_names', true );
$blogSlug = 'blog';
if ( in_array( $blogSlug, $illegalNames ) ) {
    exit( 'Noting to do' . PHP_EOL );
}
$illegalNames[] = $blogSlug;
update_metadata( 'site', SITE_ID_CURRENT_SITE, 'illegal_names', $illegalNames );
exit( 'Done' . PHP_EOL );

フォームサブディレクトリをサブドメインモードに切り替える

  • 定数IS_SUBDOMAIN_INSTALLの値をfalseからtrueに変更します
  • サイトメタsubdomain_installの値を1に設定します。

    $ wp site option set subdomain_install 1

  • メインサイトのパーマリンク構造から/blog/プレフィックスを削除する

  • 禁止名のリストからblogスラッグを削除します(それに応じて上記のスクリプトを修正します)。

結論

私の発言は、クリーンなWordPressインストールとその直後のネットワークインストールのみを考慮しています。最新のWordPressバージョン4.8も考慮されています。プラグインまたはそれ以前のバージョンのWordPressを使用している既存のシステムにマルチサイトインストールを実行すると、影響が生じる可能性があります。

しかし、私が好む設定は、サブディレクトリ用の.htaccessルールセットを備えたサブドメインモードです。それは WPStarter のような現代の作曲家によって制御された設定でさえも動作する(.htaccess規則のわずかな適応を伴う)。

4
David