更精确的Nginx位置匹配

时间:2018-08-24 14:33:07

标签: nginx

我有以下nginx规则

location /api {
    proxy_pass http://flask:5000/api;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

它将与以下路径匹配,这是我期望的

http://localhost/api
http://localhost/api/
http://localhost/api/a
http://localhost/api?
http://localhost/api?name=value

但是,它也会与以下内容匹配,这是我所不希望的

http://localhost/apii
http://localhost/apiX

我可以知道如何避免匹配不需要的http://localhost/apiihttp://localhost/apiX以及http://localhost/apiXX和...

3 个答案:

答案 0 :(得分:1)

这需要两个位置块-一个专门与/api匹配,而另一个与路径/api/中的所有内容都匹配。这样,/apio之类的网址将不会被捕获。

示例:

location = /api {
    proxy_pass http://flask:5000/api;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#Querystrings and /api, matches the first, any /api/* matches this one
location /api/ { 
    proxy_pass http://flask:5000/api;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

引用http://nginx.org/en/docs/http/ngx_http_core_module.html#location

答案 1 :(得分:0)

一种可能性是使用正则表达式。由于proxy_pass实际上并未转换URI,因此可以安全地删除uri元素。

location ~ ^/api($|/) {
    proxy_pass http://flask:5000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

请注意,正则表达式位置块按顺序求值。有关详细信息,请参见this document

答案 2 :(得分:0)

这真的很简单。

只需将location /api {更改为location /api/ {

Nginx将在结尾为/api的任何请求中添加尾部斜杠,因此无需为它们添加单独的块。此区块的行为将与您预期的一样。