如何处理 nginx 中未从根文件夹调用 index.php 的漂亮 URL?

如何处理 nginx 中未从根文件夹调用 index.php 的漂亮 URL?

因此,如果我们在 nginx.conf 的位置块中执行以下操作:

try_files $uri $uri/ /index.php?$args;

如果我们执行类似以下操作,则会从 Web 服务器的根文件夹调用 index.php 文件https://www.example.com/john

我们该如何编写以便它调用的 index.php 文件是其父文件夹中的文件?

例如:https://www.example.com/thisparent/john

这将使用来自此位置的 index.php 文件:https://www.example.com/thisparent/

这必须适用于 Web 服务器的任何位置,其中漂亮的 URL 将来自所请求 URL 的父级。

答案1

为了在内部将 URI 路径重定向/parent/child/parent/index.php,您需要计算父目录的路径/parent,因为nginx没有为父目录提供变量。

例如,您可以使用:

location ~ \.php$ {
    # PHP FASTCGI configuration
}
# Matches are eager, so the first group matches everything
# up to the last '/'. We capture it into the $parent named variable.
location ~ ^(?<parent>.*)/ {
    try_files $uri $parent/index.php$is_args$args;
}

最后一个位置的正则表达式匹配所有可能的 URI 路径,因此它必须是块中的最后一个server,并且优先于所有正常前缀位置(具有^~和精确位置的位置除外)。

一种不那么激进的解决方案是使用命名位置作为try_files指令的后备:

location / {
    try_files $uri @parent_index;
}

location ~ \.php$ {
    # PHP FASTCGI configuration
}

location @parent_index {
    rewrite ^(?<parent>.*)/ $parent/index.php;
}

答案2

我用于 nginx 的简单解决方案,仅更改一行。

在位置块中将 try_files 更改为:

location / {
      try_files $uri $uri/ $uri.html $uri.php$is_args$query_string;
}

这对我来说在 nginx 上非常完美:)

相关内容