Nginx 位置正则表达式来处理 /sub/directories 中多个 WordPress 站点的永久链接
Nginx location regex to handle permalinks of multiple WordPress sites in /sub/directories
我正在寻找一个动态解决方案来处理安装在子目录中的多个 WordPress 站点(节点)的永久链接。
可以使用这样的 URL 访问这些网站(我使用 cluster
和 node
来表示结构,但它们在每种情况下都不同,但它们始终遵循相同的结构,并且节点是包含 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;
}
我正在寻找一个动态解决方案来处理安装在子目录中的多个 WordPress 站点(节点)的永久链接。
可以使用这样的 URL 访问这些网站(我使用 cluster
和 node
来表示结构,但它们在每种情况下都不同,但它们始终遵循相同的结构,并且节点是包含 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;
}