重写除少数选择路径之外的所有子目录

时间:2016-05-03 18:47:29

标签: regex nginx nginx-location

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

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

这些是我不想重写的网址格式。 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.

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

1 个答案:

答案 0 :(得分:1)

这是一个糟糕的想法,设计明智。 如果用户错误输入domain.com/some-path/locations/some-location,根据您的有效,domain.com/some-path/location/some-location为{{1} },这是无效的,那么他们最终会把所有的打字都搞砸了,他们必须从头开始(或者只是去竞争对手)。

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

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

您可能必须在现有的location中使用此功能,或者将其保留在顶级,具体取决于配置的其余部分,因为只有一个location可以处理请求。