子目录多站点-仅根管理员在Nginx上可用

时间:2014-09-22 作者:Chris Van Patten

我试图在NGINX上安装一个多站点子目录,WordPress core在它自己的子目录中,但遇到了一些麻烦。

我正在使用此文件结构:

/home/site/dev.site.com/current/public/ --- path to webroot /home/site/dev.site.com/current/public/wp/ --- path to WP root /home/site/dev.site.com/current/public/wp/wp-admin/ --- path to WP admin root

我想要的URL结构是:

dev.site.com/wp-admin/network/ --- network admin dev.site.com/ --- root site dev.site.com/wp-admin/ --- root site admin dev.site.com/[sitename] --- additional sites dev.site.com/[sitename]/wp-admin --- additional site admin

我的NGINX多站点重写包括:

rewrite ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) /wp/$2 last; rewrite ^/([_0-9a-zA-Z-]+/)?(.*\\.php)$ /wp/$2 last;

我的完整NGINX配置是here.

目前,我can 访问网络管理员(位于dev.site.com/wp-admin/network/), 根站点(位于dev.site.com), 和根站点管理仪表板(位于dev.site.com/wp-admin/).

当我尝试访问任何其他网站时(dev.site.com/[sitename]) 我得到404(由WordPress处理)。当我尝试访问他们的管理面板时(dev.site.com/[sitename]/wp-admin/) 我获得根站点的管理仪表板(位于包含[sitename]).

我有点困惑,为什么这不起作用-一切似乎都是正确的,但很明显我缺少了一些基本的东西。我的假设是,这与我的nginx配置有关,但我不完全确定。

有没有人有过这种配置的经验?非常感谢您的帮助!

EDIT: 我已经检查了我的重写日志,nginx似乎正确地处理了重写,并传递了正确的GET URL和all:

2014/09/22 10:38:35 [notice] 4857#0: *54 rewritten data: "/wp/wp-admin/index.php", args: "", client: 127.0.0.1, server: dev.site.com, request: "GET /subsite/wp-admin/ HTTP/1.1", host: "dev.site.com", referrer: "http://dev.site.com/wp/wp-admin/"

出于某种原因,WP admin没有发现请求是针对子网站的,而只是返回站点根目录。。。

EDIT 2: 我设置了一个mu插件get_admin_url(), WordPress显然认为它与它实际返回的URL位于不同的位置。当我击中dev.site.com/subsite/wp-admin/, get_admin_url() 退货http://dev.site.com/wp-admin/, 根站点管理员的路径。情节变厚了。。。

EDIT 3: (很抱歉进行了所有编辑。)我可以通过编写一个钩住init 和运行switch_to_blog( $id ), 但这显然是一个残酷的解决方案。WordPress应该知道要加载哪个博客,然后加载它,天哪。

1 个回复
最合适的回答,由SO网友:Chris Van Patten 整理而成

我不能百分之百确定我是如何修复的,但我做到了。

我做了几件事:

确保清除Cookie,或在匿名窗口中进行测试。登录cookie给我带来了一些问题。

我将我的nginx重写替换为:

rewrite ^/(site1/|site2/|site3/)?(wp-(content|admin|includes).*)$ /wp/$2 break; rewrite ^/(?!wp/)(site1/|site2/|site3/)?(.*\\.php)$ /wp/$2 break;

因为我处理的是一个具有明确定义的站点的小型网络,所以我能够将它们直接包含在regex中。你可能需要做一些更广泛的事情;ymmv。

在重新启动服务器并清除cookies后,这似乎成功了!

结束