重写除几个 select 路径之外的所有子目录

Rewrite all sub directories except a few select paths

所以如果我有这样的当前设置。

domain.com/some-path/
domain.com/some-path/locations/
domain.com/some-path/locations/some-location
domain.com/some-path/locations/locb
domain.com/some-path/locations/infinite-location-list

这些是我不想重写的 URL 模式。 some-path 子目录,它的子 locations 子目录,以及 locations.

下的任何内容

some-path 目录下的所有其他子 URL 应该 301 定向到 /some-path/ 目录。

我试过这样的事情:

location ~* ^/some-path/(.+)? {

  if ($request_uri !~ "^/some-path/locations/(.*)$") {
    return 301 http://domain.com/some-path/;
  }

}

但是 /some-path/ 陷入重定向循环,并且 /some-path/locations/ 抛出服务器端 nginx 404。

关于如何实现我的目标的想法?

从设计角度来看,这是个坏主意。 如果用户输入错误 domain.com/some-path/locations/some-location,这是有效的,根据对你来说,因为 domain.com/some-path/location/some-location,这是无效的,那么他们最终将清除所有打字,他们将不得不从头开始(或者可能只是去你的竞争对手那里)。

但是,如果您坚持使用正则表达式:

    if ($request_uri !~ "^/some-path/($|locations/.*$)") {
        return 301 http://domain.com/some-path/;
    }

您可能必须在现有的 location 中包含它,或者甚至将其保留在顶层,具体取决于您的其余配置,因为只有一个 location处理给定的请求。