Nginx重写url路径以添加路径前缀

Jay*_*en 4 nginx

我正在使用我的 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 错误。

任何人都可以帮助我弄清楚以及如何满足要求。谢谢!

Ric*_*ith 9

您问题中的陈述格式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带有尾随/或都不带有尾随/