Nginx 位置正则表达式来处理 /sub/directories 中多个 WordPress 站点的永久链接

Nginx location regex to handle permalinks of multiple WordPress sites in /sub/directories

我正在寻找一个动态解决方案来处理安装在子目录中的多个 WordPress 站点(节点)的永久链接。

可以使用这样的 URL 访问这些网站(我使用 clusternode 来表示结构,但它们在每种情况下都不同,但它们始终遵循相同的结构,并且节点是包含 WordPress 根文件的目录):

https://www.domain.tld/cluster1/node1/

我要避免的是为每个节点创建一个规则,如下所示:

location /cluster1/node1/ {
    try_files $uri $uri/ /cluster1/node1/index.php$is_args$args;
}

location /cluster2/node2/ {
    try_files $uri $uri/ /cluster2/node2/index.php$is_args$args;
}

location /cluster3/node3/ {
    try_files $uri $uri/ /cluster3/node3/index.php$is_args$args;
}

location /cluster4/node4/ {
    try_files $uri $uri/ /cluster4/node4/index.php$is_args$args;
}

可行,但有超过 43 个节点(不断变化)。所以,我尝试了以下方法:

location /([^/]+)/([^/]+)/ {
    try_files $uri $uri/ ///index.php$is_args$args;
}

正确显示主页,但显示节点页面的 404(如 https://www.domain.tld/cluster1/node1/page/)(由 Nginx 而非 WordPress 呈现)。

location ~ ^/([^/]+)/([^/]+)/ {
    try_files $uri $uri/ ///index.php$is_args$args;
}

但这使得 PHP 文件被下载为名为 download.

的文件
location ~ /([^/]+)/([^/]+)/ {
    try_files $uri $uri/ ///index.php$is_args$args;
}

同上

location ^~ /([^/]+)/([^/]+)/ {
    try_files $uri $uri/ ///index.php$is_args$args;
}

这使得该节点的 主页 下载与之前的尝试相同,但显示节点页面的 404(如 https://www.domain.tld/cluster1/node1/page/)(呈现通过 Nginx 而不是 WordPress)。

关于上述 none 为何有效的任何线索?关于如何让它发挥作用有什么建议吗?

谢谢大家!

您需要使用正则表达式 location 块来捕获内部重定向到正确 index.php 处理程序的参数。正则表达式 location 是使用 ~~* 修饰符声明的。有关详细信息,请参阅 this document

正则表达式按顺序求值,因此 \.php$ location 必须 放在您要插入的 location 之上。否则,PHP 文件将被下载而不是被执行。

例如:

location ~ \.php$ {
    ...
}
location ~ ^/([^/]+)/([^/]+)/ {
    try_files $uri $uri/ ///index.php$is_args$args;
}