如何将 URL 参数从 Nginx 转发到我的服务器的 API?

如何将 URL 参数从 Nginx 转发到我的服务器的 API?

我正在尝试创建“仅限用户”部分,我设法做到了这一点,但我卡住了。我如何将请求的 URL 发送到我的 API?

这是我的 Express.js API 路由,非常简单。用户访问链接(直接链接、页面上的嵌入式链接/视频等)并尝试查看它。我将他的请求重定向到我的 /api 并检查他是否被允许查看它。如果我删除 :file 部分并使用 200 和 403 进行测试,下面的操作就可以正常工作,但我需要能够动态检查它们。

下面是更清晰的解释。“/”是通用 URL,但只有当访问者尝试访问文件时才应触发 /api,无论文件的位置/URL 是什么。所以我想做的是,“好的,我是 Nginx,我看到一些访问者尝试访问某个文件。让我们将此文件的名称传递给 Express.js 服务器,并让它检查是否允许此用户查看此图像。如果它显示 200,我会允许它。如果它是 403,那么不行。”

app.get('/api/:file', function(req,res,next) {
  // This part decides what you're allowed to see.
  // Redis database query. Returns 0 or 1. 
  // 1 returns 200, 0 returns 403.
  res.sendStatus(200); // It works, so this part is done.
});

但我不知道如何将请求的 url 参数从 Nginx 传递到我的 Express.js 应用程序(例如http://localhost/api/:文件我使用 .NET Framework 3.5 版本中的一种格式来检查用户的权限(即,我可以在其中使用 .NET Framework 3.5 格式的权限),这样我就可以根据数据库检查用户的权限并为每个文件返回动态响应。

这是我当前的 Nginx 配置。

upstream localhost {
  ip_hash;
  server 127.0.0.1:8000;
  server 127.0.0.1:8001;
  server 127.0.0.1:8002;
  server 127.0.0.1:8003;
}

server {
  listen 80;
  server_name localhost;

  location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ {
    root images;
    auth_request /api;
  }

  location / {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_pass http://localhost;
  }
}

答案1

尝试:

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ {
    rewrite ^ /api/$1?$args permanent;
}

这应该将文件请求重写为 api 路径。然后你的 api 可以决定是否让用户通过。

相关内容