我在一台机器上有两个服务器程序。一个在 localhost:3000 监听,另一个在 localhost:3001 监听。第二个是 API 服务器,第一个提供网页。
我想使用 nginx 作为反向代理,这样传入到 URI 的请求如下
https://example.com/api/what/ever
重定向到第二台服务器http://localhost:3001/what/ever
,如下所示
https://example.com/ and https://example.com/some/route/what/ever
重定向到第一台服务器
http://localhost:3000/ and http://localhost:3000/some/route/what/ever
换句话说,我想挑选一些example.com/api/*
请求发送到第二台服务器,并将其余的请求发送到第一台服务器。
但是,它的工作方式就好像我的/api/
位置指令不存在一样:所有内容都传递到第一个服务器,该服务器当然会对 api 请求响应 404,并且通常对其他请求也会响应 404。
这是我的 nginx.conf 尝试。
location ^~ /hub/ {
rewrite ^/hub(.*)$ $1 last;
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
我还尝试了location ~ ^(?!/api).*$ {
第二个位置指令,使用正则表达式试图使其与我的 /api/ URI 不匹配,但结果相同。
我做错了什么?这可能吗?
答案1
last
语句中的关键字使rewrite
Nginx 重新开始搜索位置以处理重写的 URI。您的rewrite...last
语句将请求发送到另一个位置块。
若要在同一个块内处理重写的 URI location
,请使用break
。请参阅这个文件了解详情。
例如:
location ^~ /hub/ {
rewrite ^/hub(.*)$ $1 break;
proxy_pass http://localhost:3001;
...
}
或者,也可以通过将可选 URI 附加到语句中的值来实现相同的转换proxy_pass
。请参阅这个文件了解详情。
例如:
location ^~ /hub/ {
proxy_pass http://localhost:3001/;
...
}