多站点:子域和子目录模式的区别?安装后可以切换吗?

时间:2017-10-23 作者:David

WordPress多站点功能提供了两种不同的安装模式:子域和子目录安装。默认情况下,这两种模式都允许在一个安装和一个主域中管理单独的WordPress实例(站点)。明显的区别是所有站点的URL模式(在示例中multisite.tld 是主要域):

  • http://site1.multisite.tld 用于子域安装和http://multisite.tld/site1 对于子目录安装map any arbitrary domain to sites 在这两种模式下创建之后,我想知道两者之间的实际区别是什么?此外,是否有方法在安装后更改模式?

1 个回复
SO网友:David

从用户的角度来看,有两个明显的区别。首先是用于创建新站点的GUI。它显示URL路径(子目录)的第一段的输入字段,或者显示要用于新站点的子域的输入字段。(只有在编辑已创建的网站时,才能将URL设置为完全任意的值。但在两种模式下都可以。)

另一个在第一眼看来并不明显,它只影响子目录模式:主站点的永久链接结构将有一个静态前缀blog/ 这并不是要改变的。(即使可能存在更改或删除前缀的解决方案)。

从技术角度来看,这是一种不同的系统配置,由配置常量、数据库中的配置值以及web服务器的配置定义。什么首先定义了模式?它是常量IS_SUBDOMAIN_INSTALL 可设置为true (子域模式)或false (子目录模式)。但这并不是存储这些信息的唯一地方。在安装过程中,WordPress使用键将整数值存储为site metasubdomain_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路由到正确的脚本或资产文件。主要是关于是否路由请求URL的问题,如/site-slug/wp-[admin|content|includes]/site-slug/wp-*.php 到相应的目录(/wp-*/) 或脚本。

因此,默认建议的重写规则集subdirectory mode 这是:

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]
鉴于subdomain mode 建议如下:

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提供了该函数is_subdomain_install() 它返回true 如果:

常数SUBDOMAIN_INSTALL 定义并设置为true orSUBDOMAIN_INSTALL 未定义,但VHOST 定义并设置为\'yes\'返回false 如果SUBDOMAIN_INSTALL 定义并设置为false. 如果SUBDOMAIN_INSTALL 已定义,但不是布尔类型。上述站点元值仅在mutliste设置过程中使用。WordPress核心仅依赖于该常量在其他地方的值。

然而is_subdomain_install() 仅当常量DOMAIN_CURRENT_SITEPATH_CURRENT_SITE 未定义。(参见ms_load_current_site_and_network()). 这意味着可以在两种模式下使用任何域作为站点URL(域映射)。

设置后切换模式从子域切换到子目录模式更改常量值IS_SUBDOMAIN_INSTALL 从…起truefalsesubdomain_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 从…起falsetruesubdomain_install 到1:

$ wp site option set subdomain_install 1

/blog/ 主站点permalink结构的前缀

移除blog 从禁用名称列表中删除(相应地修改上面的脚本)

    结论

    我的评论只考虑干净的WordPress安装和紧接着的网络安装。还考虑了最新的WordPress版本4.8。在使用插件或任何旧版本的WordPress的现有系统上进行多站点安装时,可能会有影响。

    但是,我首选的设置是具有的子域模式。htaccess子目录规则集,因为它提供了最灵活的开箱即用性。它甚至适用于现代作曲家控制的设置,如WPStarter (略微修改了.htaccess规则)。

结束

相关推荐

在WordPress MultiSite中创建默认页面

新网站创建时,我正在努力创建WordPress多站点页面。我找到了一些钩子来实现这一点,但钩子没有响应。我在stack和其他网站上找到的一些资源是https://stackoverflow.com/questions/40014419/wordpress-multisite-default-page-for-newly-created-site 和http://www.wpbeginner.com/wp-tutorials/how-to-add-remove-default-pages-in-wordpr