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

时间:2019-03-19 03:32:49

标签: nginx

我正在使用Nginx服务器,并且不知道如何在现有网址中添加/ api前缀。

我有两个Flask公开的端点/ api / deepzoom和/ api / detection。 我还不想更改调用/ deepzoom和/ detection的前端代码。

从前端使用/ deepzoom调用时,如何将url路径重写/重定向到/ api / deepzoom

我当前在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;

    }
 }

我尝试在服务器块中添加以下行:

rewrite ^ /detection/ http://$server_name/api/detection/$1 permanent;
rewrite ^ /deepzoom/ http://$server_name/api/deepzoom/$1 permanent;

但不适用于404 Not Found错误。

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

1 个答案:

答案 0 :(得分:0)

您问题中的rewrite...permanent语句格式错误,无法执行您所需的功能。

  • permanent导致重定向,响应为301
  • ^/字符之间有空格
  • 没有括号可以捕获$1的值

要在内部将URI传递给上游之前重写URI,可以使用rewrite...last。有关详细信息,请参见this document

例如:

rewrite ^(/(detection|deepzoom)(/.*)?)$ /api$1 last;
location ^~ /api/detection { ... }
location ^~ /api/deepzoom { ... }

请注意,如果端点是/api/deepzoom,则您不希望在/值上尾随location


您可以使用proxy_pass指令实现类似的行为。有关详细信息,请参见this document

例如:

location ^~ /deepzoom {
    include     uwsgi_params;
    proxy_pass  http://deepzoom/api/deepzoom;
}

请注意,locationproxy_pass的值都尾随/,或者都没有尾随/