Nginx 正则表达式位置不匹配
Nginx regex location not matching
我使用 Nginx 1.14.0 在 Ubuntu VM 上提供一些服务。在我的服务器定义中,我包括一个位置块,用于转发来自 /api/v{version}/users{suffix}
的请求,其中版本应该是一个数字,如 1.0 或 2.1,后缀可以为空或可以是路由的一部分。我的目标是转发到localhost:5006/v{version}/users{suffix}
。我这样做的原因是我也有 /api/v{version}/rooms{suffix}
和 /api/v{version}/prompts{suffix}
并且它们转到不同的端口。目前,我的位置块如下所示:
location ~ ^\/api\/v(([0-9]+)\.([0-9]+))\/users(.*)$ {
proxy_pass https://localhost:5006/v/users;
proxy_http_version 1.1;
proxy_pass_request_headers on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
但是,当我尝试调用 /api/v1.0/users/31245
时,我得到了 502,在检查我的错误日志时,我看到了:
[error] 2591#2591: *6052 no resolver defined to resolve localhost, client: [MY_IP_ADDR], server: [SERVER_NAME], request: "GET /api/v1.0/users/158015ab-3811-4137-8a13-102d9b400050 HTTP/1.1"
这似乎是因为请求无法与位置匹配。我已经在几个不同的 Nginx 测试仪上对此进行了测试,它似乎有效,那么我在这里做错了什么?
在 proxy_pass
语句中使用变量需要 Nginx 使用解析器。有关详细信息,请参阅 this document。
要么指定一个 resolver
statement,要么更好,重写块以避免在 proxy_pass
语句中使用变量。
例如:
location ~ ^/api/v[0-9]+\.[0-9]+/users {
rewrite ^/api(.*)$ break;
proxy_pass https://localhost:5006;
...
}
我使用 Nginx 1.14.0 在 Ubuntu VM 上提供一些服务。在我的服务器定义中,我包括一个位置块,用于转发来自 /api/v{version}/users{suffix}
的请求,其中版本应该是一个数字,如 1.0 或 2.1,后缀可以为空或可以是路由的一部分。我的目标是转发到localhost:5006/v{version}/users{suffix}
。我这样做的原因是我也有 /api/v{version}/rooms{suffix}
和 /api/v{version}/prompts{suffix}
并且它们转到不同的端口。目前,我的位置块如下所示:
location ~ ^\/api\/v(([0-9]+)\.([0-9]+))\/users(.*)$ {
proxy_pass https://localhost:5006/v/users;
proxy_http_version 1.1;
proxy_pass_request_headers on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
但是,当我尝试调用 /api/v1.0/users/31245
时,我得到了 502,在检查我的错误日志时,我看到了:
[error] 2591#2591: *6052 no resolver defined to resolve localhost, client: [MY_IP_ADDR], server: [SERVER_NAME], request: "GET /api/v1.0/users/158015ab-3811-4137-8a13-102d9b400050 HTTP/1.1"
这似乎是因为请求无法与位置匹配。我已经在几个不同的 Nginx 测试仪上对此进行了测试,它似乎有效,那么我在这里做错了什么?
在 proxy_pass
语句中使用变量需要 Nginx 使用解析器。有关详细信息,请参阅 this document。
要么指定一个 resolver
statement,要么更好,重写块以避免在 proxy_pass
语句中使用变量。
例如:
location ~ ^/api/v[0-9]+\.[0-9]+/users {
rewrite ^/api(.*)$ break;
proxy_pass https://localhost:5006;
...
}