NGINX位置块,具有有限数量的路径段

b5lpy0ml  于 7个月前  发布在  Nginx
关注(0)|答案(1)|浏览(97)

我有一个以~* /api/v1/(?<endpoint>.*)开头的路径。但我意识到这可能会被滥用。有没有一种方法可以将/api/v1之后的路径段数量限制为3,同时仍然能够保留任何GET变量(如果有的话)?
这些都会过去:

  • /api/v1/foo
  • /api/v1/foo/bar
  • /api/v1/foo/bar/baz
  • /api/v1/foo/bar/baz?x=hello&y=world

这些不会:

  • /api/v1/foo/bar/baz/aaa
  • /api/v1/foo/bar/baz/aaa/n

我只看到了3个路径段max after/api/v1。超过这个值就不应该匹配了。这在location块中可能吗?我愿意接受建议。
在此之后,我在捕获组上使用proxy_pass将其与可能存在的任何GET变量一起传递给FastAPI后端沿着,以便/api/v1/foo/bar作为/foo/bar接收。

**更新:**增加了我之前忘记的GET变量。

bvn4nwqk

bvn4nwqk1#

查看问题中的正则表达式,您需要将.*序列(匹配任何内容)更改为仅匹配一个、两个或三个路径元素的序列。
举例来说:

[^/]+(/[^/]+){0,2}

字符串
为了完整起见,在匹配整个字符串时,应该使用^$锚点。* 请注意,查询字符串不是location语句测试的规范化URI的一部分。*
最后,Nginx要求任何包含大括号的表达式都用引号保护。
因此,您可以使用以下正则表达式位置来仅匹配允许的URL:

location ~* "^/api/v1/(?<endpoint>[^/]+(/[^/]+){0,2})$" {
    ...
}


路径元素过多的URL将被其他位置块处理。通常,如果没有正则表达式位置与URL匹配,则将使用具有最长匹配前缀的前缀位置。
因此,以下前缀位置将匹配任何以/api/v1/开头但不匹配以上正则表达式位置的URL,包括那些路径元素过多的URL:

location /api/v1/ { 
    return 444; 
}

相关问题