nginx 嵌套位置失败

nginx 嵌套位置失败

我需要在我的网站上的一组特定 URI 上强制使用尾部斜杠。

URI 采用以下格式:/foo/bar1/bar2/bar3/?abc,其中/foo/是所有动态的通用URI,并且它本身也是有效的URI。

假设已执行^(.*[^/])$前缀检查,则所有且只有动态 URI 才会与正则表达式匹配。/foo/

我的代码目前如下所示:

location /foo/ {
  location ~* ^(.*[^/])$ {
    return 302 $baseUrl/$1/$is_args$args;
  }
}

然而,这会导致所有页面出现 404 错误/foo/.*,尽管它确实按预期成功插入了斜线。

显然,如果它与外部位置匹配,但与内部位置不匹配,则会失败。

我所寻找的是一个导致执行退出外部位置的语句。

笔记:

我意识到我只能说

location ~* ^(/foo/.*[^/])$ {
  return 302 $baseUrl/$1/$is_args$args;
}

但由于正则表达式的性能问题,我想避免使用它。我不想在非候选页面上处理这个问题。

答案1

经过更多的研究和实验,我最终将这个条件移到了最后的

location / {
   try files  . . .
}

得到类似的东西

location / {
  ## Enforce trailing slash on dynamic pages
  location /foo/ {
    location ~* ^(.*[^/])$ {
      return 302 $baseUrl/$1/$is_args$args;
    }
    try_files $uri $uri/ /index.php?$args;
  }

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

仍然有点混乱,并且有重复的代码,但它可以工作

相关内容