我正在使用我的 nginx 服务器,但我不知道如何将 /api 前缀添加到现有的 url 中。
我有 Flask 公开的两个端点 /api/deepzoom 和 /api/detection。我还不想更改前端调用 /deepzoom 和 /detection 的代码。
当使用 /deepzoom 从前端调用时,如何重写/重定向到 /api/deepzoom 的 url 路径
我当前在 nginx.conf 中的片段:
upstream platform {
server platform:5001;
}
upstream models {
server models:4999;
}
upstream deepzoom {
server deepzoom:5999;
}
server {
listen 80 ;
server_name myhost.mydomain.com;
client_max_body_size 0;
client_body_buffer_size 1m;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
send_timeout 10m;
proxy_buffer_size 512k;
proxy_buffers 4 1024k;
proxy_busy_buffers_size 1024k;
proxy_redirect off;
location ^~ /api/detection/ {
include uwsgi_params;
proxy_pass http://models;
}
location ^~ /api/deepzoom/ {
include uwsgi_params;
proxy_pass http://deepzoom;
}
location / {
include uwsgi_params;
proxy_pass http://platform;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试在服务器块中添加行:
rewrite ^ /detection/ http://$server_name/api/detection/$1 permanent;
rewrite ^ /deepzoom/ http://$server_name/api/deepzoom/$1 permanent;
Run Code Online (Sandbox Code Playgroud)
但它不适用于 404 Not Found 错误。
任何人都可以帮助我弄清楚以及如何满足要求。谢谢!
您问题中的陈述格式rewrite...permanent
错误,无法执行您所需的功能。
permanent
导致重定向并返回 301 响应^
和/
字符之间有空格$1
要在将 URI 传递到上游之前在内部重写 URI,您可以使用rewrite...last
. 有关详细信息,请参阅此文档。
例如:
rewrite ^(/(detection|deepzoom)(/.*)?)$ /api$1 last;
location ^~ /api/detection { ... }
location ^~ /api/deepzoom { ... }
Run Code Online (Sandbox Code Playgroud)
请注意,如果您的端点是/api/deepzoom
,那么您不希望/
您的location
值尾随。
您可以使用该指令实现类似的行为proxy_pass
。有关详细信息,请参阅此文档。
例如:
location ^~ /deepzoom {
include uwsgi_params;
proxy_pass http://deepzoom/api/deepzoom;
}
Run Code Online (Sandbox Code Playgroud)
请注意 和location
值都proxy_pass
带有尾随/
或都不带有尾随/
。