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

xxls0lw8  于 2022-11-28  发布在  Nginx
关注(0)|答案(2)|浏览(1488)

我正在使用我的nginx服务器,我不知道如何添加/api前缀到现有的网址。
我有两个端点/api/deepzoom和/api/detection被Flask公开。我还不想更改前端中调用/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 NotFound错误。
任何人都可以帮助我弄清楚它和如何满足要求。谢谢!

to94eoyn

to94eoyn1#

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

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

要在向上游传递URI之前在内部重写URI,可以使用rewrite...last。有关详细信息,请参阅此文档。
例如:

rewrite ^(/(detection|deepzoom)(/.*)?)$ /api$1 last;
location ^~ /api/detection { ... }
location ^~ /api/deepzoom { ... }
  • 请注意,如果您的端点是/api/deepzoom,则您不希望在location值上有尾随的/。*

您可以使用proxy_pass指令实现类似的行为。有关详细信息,请参阅本文档。
例如:

location ^~ /deepzoom {
    include     uwsgi_params;
    proxy_pass  http://deepzoom/api/deepzoom;
}
  • 请注意,locationproxy_pass值都有尾随/,或者都没有尾随/。*
3zwtqj6y

3zwtqj6y2#

当我在nginx前面运行一个React应用程序时,我发现了这个问题。我希望所有对应用程序的请求都有前缀/mypref,因为我的应用程序文件在一个名为/mypref的子目录中。如果一个url已经以/mypref开头,我想把url的剩余部分“转发”到index.html,这样react-router就可以处理它了。下面的nginx配置很适合我:

# redirect requests not matching /mypref so that they start with /mypref/...
location / {
  absolute_redirect off;
  return 301 /mypref$request_uri;
}

# This config allows access to nested routes directly.
# Example: Without this, if you accessed https://myapp.com/mypref/my-requests directly, it
# would fail. You would need to access https://myapp.com/mypref/ first, and then navigate to
# the nested route.
# With this config in place, you can go to the nested route and anything after /mypref/ automatically gets passed to
# the index file so that it can be handled by react-router
location /mypref {
  absolute_redirect off;
  if (!-e $request_filename) {
    rewrite ^(.*)$ /mypref/ break;
  }
  index index.html index.htm Default.htm;
}

我在这里使用了相对重定向,因为我的应用程序位于网关前面,我不希望用户离开网关。

相关问题