标题好长……不过笔者觉得仍然有必要在文章开头描述一下错误背景。如果您看完标题,就知道笔者在说什么了,则可以直接跳转到〈解决方案〉章节。
背景知识
多站点网络(Multisite network)是WordPress的一个功能,它可以让用户在一个WordPress仪表盘上创建并运行多个WordPress网站,而这些网站可以被指定不同的主域名。
虽曰如此,正所谓「天无二日,(……)1」,一个多站点网络内,只能有一个网站被指定为主站点(通常是最早存在的那个)。
而创建主域名与主站点相异的子站点后,一旦想要访问管理后台,输入账号与密码后,会被告知:
错误:您的浏览器阻止或不支持Cookie。您必须启用Cookie才能使用WordPress。
如果您的站点语言为英文,这段报错会表现为:
ERROR: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress.
例如,您的主站为sanguok.com,而同网络内另一个子站为example.com
2,则可能在尝试登录example.com
管理后台的过程中遇到此问题。
解决方案

首先,清除浏览器缓存(包括cookie)以及缓存插件等的服务器缓存。
然后通过FTP等访问WordPress站点的根目录(即有wp-admin
、wp-content
等子目录的地方);
在wp-config.php
文件中,添加(或设置)如下:
define('ADMIN_COOKIE_PATH', '/');
define('COOKIE_DOMAIN', '');
define('COOKIEPATH', '');
define('SITECOOKIEPATH', '');
恭喜,这下站点可以正常使用了。
对网上所流传另一方案的辨正
笔者尝试透过搜索引擎寻求解决方案时,发现网络上更多流传着另一种解决方案。
如网民bulgaru所指出的那样,在wp-config.php
文件中,添加(或设置)如下:
define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'your-domain.com'); // 山月按:将your-domain.com改为您实际的主域名,例如sanguok.com
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
define('SUNRISE', 'on');
还有一种方案指出,要为wp-config.php
文件添加(或设置)如下:
// Set cookie domain for login cookies
define( 'COOKIE_DOMAIN', '.your-domain.com' ); // 山月按:将your-domain.com改为您实际的主域名,例如sanguok.com
这样修改通常或许有用,但在本文所举案例下不奏效。这是因为本文案例具有「不同主域名」这一特殊性。无论是DOMAIN_CURRENT_SITE
还是COOKIE_DOMAIN
,您都只能define
(定义)为一个值,而非多个值。
举个例子,如果您同时有sanguok.com
与example.com
两个网站,则无论将DOMAIN_CURRENT_SITE
或COOKIE_DOMAIN
指定给谁,都会导致剩下一个网站出现cookie错误。所以本章节所述方法,在「不同主域名」这一特殊条件下不奏效。
重建配置文件:消灭问题本身
常言道:「消灭问题本身,而非解决问题。」如果前述的方法不奏效,则可能是wp-config.php
有些其他错误,例如编码错误、配置错误……积重难返。

wp-config.php
可能有编码错误使用控制变量的方法逐行排查代码或许是一个解决方案。
但您若不耐烦了,索性推倒重来。将网站根目录下的wp-config-sample.php
重命名为wp-config.php
(如找不到,下载最新的WordPress安装包,并取出其中的wp-config-sample.php
文件),并手动修改里面的配置信息,上传替换。
绕过cookie请求:消灭提出问题的人
如果总是出现cookie错误,为了能够登录管理后台,您或许可以考虑以下方案——
将以下代码段添加到主题的functions.php
文件中:
setcookie(TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN);
if ( SITECOOKIEPATH != COOKIEPATH ) setcookie(TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN);
这样做可以忽略网站检查cookie的请求,径直登录。
但是阻止报错并不能消灭问题本身。如果cookie错误客观存在,那么对应网站依赖于cookie的功能仍旧无法实现。例如,您无法在有cookie错误的站点打开加密文章——每次输入正确的密码,点击确认,网页刷新后,仍然会停留在输入密码的界面,无限重复。因为问题仍旧存在,您只是消灭了「提出问题的人」。
一些万金油
和WordPress斗争了这么久,笔者发现了一些万金油式的排查思路。虽然并不针对本文所举案例,也未必在所有情况下都奏效,但权资参考,并陈于下。
.htaccess
问题?
如网民Marc所指出,WordPress多站点网络的很多问题出在.htaccess
3的配置上。
如果您有能力,检视并排查代码。
不然,从服务器中删除.htaccess
文件(建议删除前备份一下)。
如果问题得以自然解决,转到网站设置,并保存永久链接设置,一个新的.htaccess
文件会被自动创建。
插件问题?
通过FTP等禁用所有插件。
将网站目录下的plugins
文件夹重命名为任何字符。比如,请出你的猫仔(如有),将它重命名为njfgtews
4,确保这串字和同目录下的其他文件夹都不同名5。于是,所有插件都会被禁用。
如果问题得以自然解决,将猫仔(如有)请走,把文件夹名称改回plugins
,然后一个个启用插件,确保问题不重新出现。如问题复现,恭喜您揪出了源头。
通常来说,缓存或安全性插件会导致此类问题。
HTTPS问题?
如果您安装了SSL插件,检查它有否正确重定向到HTTPS。
主题问题?
WordPress的主题也是一个意想不到的问题源头。
您可以将存放主题的文件夹重命名为任何字符,就像前面所举的请猫仔(如有)命名那样。之后,网站将恢复为默认的WordPress主题,例如「2022」,而与主题相关的问题便会不见。
若然,则删除网站出问题的时候所用的主题。
结语
通过上述介绍,您应该了解到了WordPress多站点网络分布于不同主域名时,登录管理后台出现cookie错误的解决方案吧。如果您仍有疑问,或有意见想要指导,欢迎于评论区留言。您也可以移步浏览更多笔者所总结的WordPress小攻略,订阅WordPress相关文章的RSS。
.htaccess
文件管理用户对网站目录的访问。阅读Wiliz《.htaccess详解》了解更多。本文转自: https://sanguok.com/blog/solution-for-cookie-error-when-logging-into-admin-backend-when-network-sites-have-their-own-main-domain-name/
本站仅做收录,版权归原作者所有。