我有以下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/apii
和http://localhost/apiX
以及http://localhost/apiXX
和...
答案 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
的任何请求中添加尾部斜杠,因此无需为它们添加单独的块。此区块的行为将与您预期的一样。