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

b5lpy0ml  于 2023-11-17  发布在  Nginx
关注(0)|答案(1)|浏览(233)

我有一个以~* /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#

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

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

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

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


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

  1. location /api/v1/ {
  2. return 444;
  3. }

展开查看全部

相关问题