从用户的角度来看,有两个明显的区别。首先是用于创建新站点的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
or常数SUBDOMAIN_INSTALL
未定义,但VHOST
定义并设置为\'yes\'
返回false
如果SUBDOMAIN_INSTALL
定义并设置为false
. 如果SUBDOMAIN_INSTALL
已定义,但不是布尔类型。上述站点元值仅在mutliste设置过程中使用。WordPress核心仅依赖于该常量在其他地方的值。
然而is_subdomain_install()
仅当常量DOMAIN_CURRENT_SITE
和PATH_CURRENT_SITE
未定义。(参见ms_load_current_site_and_network()
). 这意味着可以在两种模式下使用任何域作为站点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/
主站点permalink结构的前缀
移除blog
从禁用名称列表中删除(相应地修改上面的脚本)