WordPress多站点网络分布于不同主域名时登录管理后台出现cookie错误的解决方案

标题好长……不过笔者觉得仍然有必要在文章开头描述一下错误背景。如果您看完标题,就知道笔者在说什么了,则可以直接滑到〈解决方案〉章节。

背景知识

多站点网络(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.com2该域名实际上是IANA持有的示例站点。,则可能在尝试登录example.com管理后台的过程中遇到此问题。

解决方案

如果有使用面板软件管理服务器,则可以直接访问面板的文件管理器,完成如下操作

首先,清除浏览器缓存(包括cookie)以及缓存插件等的服务器缓存。

然后通过FTP等访问WordPress站点的根目录(即有wp-adminwp-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.comexample.com两个网站,则无论将DOMAIN_CURRENT_SITECOOKIE_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多站点网络的很多问题出在.htaccess3简单来说,.htaccess文件管理用户对网站目录的访问。阅读Wiliz《.htaccess详解》了解更多。的配置上。

如果您有能力,检视并排查代码。

不然,从服务器中删除.htaccess文件(建议删除前备份一下)。

如果问题得以自然解决,转到网站设置,并保存永久链接设置,一个新的.htaccess文件会被自动创建。

插件问题?

通过FTP等禁用所有插件。

将网站目录下的plugins文件夹重命名为任何字符。比如,请出你的猫仔(如有),将它重命名为njfgtews4一串对人类来说无意义的字符,只存在于博尔赫斯笔下的巴别图书馆。,确保这串字和同目录下的其他文件夹都不同名5也就是确保这串字符对机器也没有意义。。于是,所有插件都会被禁用。

如果问题得以自然解决,将猫仔(如有)请走,把文件夹名称改回plugins,然后一个个启用插件,确保问题不重新出现。如问题复现,恭喜您揪出了源头。

通常来说,缓存或安全性插件会导致此类问题。

HTTPS问题?

如果您安装了SSL插件,检查它有否正确重定向到HTTPS。

主题问题?

WordPress的主题也是一个意想不到的问题源头。

您可以将存放主题的文件夹重命名为任何字符,就像前面所举的请猫仔(如有)命名那样。之后,网站将恢复为默认的WordPress主题,例如「2022」,而与主题相关的问题便会不见。

若然,则删除网站出问题的时候所用的主题。

结语

通过上述介绍,您应该了解到了WordPress多站点网络分布于不同主域名时,登录管理后台出现cookie错误的解决方案吧。如果您仍有疑问,或有意见想要指导,欢迎于评论区留言。您也可以移步浏览更多笔者所总结的WordPress小攻略,订阅WordPress相关文章的RSS

  • 1
    出自《礼记·曾子问》——或者是您觉得的那个出处,意思是天上没有两个太阳。下文从略。
  • 2
    该域名实际上是IANA持有的示例站点。
  • 3
    简单来说,.htaccess文件管理用户对网站目录的访问。阅读Wiliz《.htaccess详解》了解更多。
  • 4
    一串对人类来说无意义的字符,只存在于博尔赫斯笔下的巴别图书馆。
  • 5
    也就是确保这串字符对机器也没有意义。

1條評論

評論

%d 位部落客按了讚: