NGINX 反向代理不适用于 swagger-ui-express

NGINX 反向代理不适用于 swagger-ui-express

我使用 NGINX 来处理所有以nodejs api 服务器为proxy_pass前缀的请求。/auth/localhost:3000

我有这个单一配置文件/etc/nginx/sites-enabled/default3.conf

server {
    
    location /auth/ {
        rewrite /auth/(.+) /$1 break;
        proxy_pass http://127.0.0.1:3000;
        proxy_redirect off;
        proxy_set_header HOST $host;
    }


}

它对我的大多数请求都工作正常(而不是 GET http://localhost:3000/logout, GEThttp://localhost/auth/logout会按预期工作),除了这个请求 GET http://localhost/auth/docs,它应该映射到http://localhost:3000/docs但我得到了一个重定向:

HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0 (Ubuntu)
Date: Wed, 15 Dec 2021 01:59:02 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 175
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Security-Policy: default-src 'none'
X-Content-Type-Options: nosniff
Location: /docs/

然后出现 404 NOT FOUND :

HTTP/1.1 404 Not Found
Server: nginx/1.18.0 (Ubuntu)
Date: Wed, 15 Dec 2021 03:20:26 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Content-Encoding: gzip

好像当我 GET 时http://localhost/auth/docs,请求到达了我的 nodejs 服务器,但随后被重定向回http://localhost/docs,但这怎么可能呢?我仍然可以http://localhost:3000/docs毫无问题地 GET。

更新

http://localhost:3000/docs是我使用 npm 模块为服务器 API 提供 Swagger UI 的地方swagger-ui-express

答案1

问题

  • 问题在于swagger-ui-express我的 nodejs 服务器用于提供 API 文档的模块。
  • 我将其配置为在 上提供服务/docs,并且模块将进行 301 重定向以准确地发出请求$HOST/docs,因为 HOST 是请求主机(localhost:3000, 或localhost)。
  • 因此,当像我一样将其置于 NGINX 反向代理之后时,每个 GEThttp://localhost/auth/docs都会到达我的 nodejs 服务器,但会被重定向到,http://localhost/docs就像我在第 2 点中所说的那样。

解决方案

  • 配置 NGINX 在请求匹配时生成另一个 proxy_pass /docs/
    location /docs/ {
        proxy_pass http://127.0.0.1:3000/docs/;
    }
  • 当心传递给的 URI 具有尾部斜线,因为模块swagger-ui-express需要尾部斜杠。否则/auth/docs将被重定向到/docs/并将再次/docs/重定向到/auth/docs(无限循环直到出错)。虽然在位置匹配和代理传递 URL 中都可以删除尾部斜杠。

相关内容