在 nginx 中,`location` 配合 `proxy_pass` 转发后端接口的核心做法是:在 `server` 块内定义 `location` 匹配规则,并在其中使用 `proxy_pass` 指定后端服务的地址。如果 `location` 路径包含 uri(如 `/api/`),nginx 会将请求的 uri 附加到代理地址后;若代理地址以斜杠结尾,则只传递匹配部分之后的内容。通过这种方式,可以将客户端对特定路径的请求透明地转发给上游服务。

如何配置 location 将 /api 请求转发到后端
要将 `/api` 开头的请求转发到后端,需要在 `nginx.conf` 的 `server` 块中添加一个 `location` 指令,并设置 `proxy_pass` 指向目标地址。例如,将所有 `/api` 请求转发到运行在 8080 端口的 Node.js 服务,只需配置如下:

server {
listen 80;
server_name example.com;
location /api {
proxy_pass http://127.0.0.1:8080;
}
}当客户端访问 `http://example.com/api/users` 时,Nginx 会将完整路径 `/api/users` 发送给后端 `http://127.0.0.1:8080/api/users`。这是因为 `proxy_pass` 的值没有以斜杠结尾,Nginx 会保留原始 URI 的剩余部分。如果希望去掉 `/api` 前缀,可以修改为 `proxy_pass http://127.0.0.1:8080/;`,此时请求将被转发为 `http://127.0.0.1:8080/users`。
如何处理静态资源与 API 的混合路由
在实际项目中,通常需要将静态文件(如 CSS、JS)和动态 API 请求分开处理。可以通过定义不同的 `location` 块来实现。对于静态资源,使用 `root` 或 `alias` 指令直接提供文件;对于 API 请求,使用 `proxy_pass` 转发。这种配置确保了请求被正确分发,避免了冲突。

server {
listen 80;
server_name example.com;
# 静态资源
location /static {
root /var/www/html;
}
# API 接口
location /api {
proxy_pass http://backend_server;
}
}在上述配置中,访问 `/static/style.css` 会直接从 `/var/www/html/static/style.css` 读取文件,而 `/api/data` 会被转发到 `backend_server`。这种分离方式提高了性能,因为静态文件由 Nginx 直接处理,无需经过后端应用服务器。注意,`location` 的匹配优先级遵循最长前缀原则,因此更具体的路径应放在前面,或者使用精确匹配 `=` 来确保优先级。
proxy_pass 末尾斜杠对 URI 传递的影响
在使用 `proxy_pass` 时,是否包含末尾斜杠会直接影响传递给后端的 URI。如果 `proxy_pass` 值以斜杠结尾,Nginx 会用 `proxy_pass` 的 URI 替换 `location` 匹配的 URI 部分;如果不以斜杠结尾,则追加原始 URI。例如,`location /api { proxy_pass http://localhost:8080/; }` 会将 `/api/test` 转发为 `http://localhost:8080/test`。而 `location /api { proxy_pass http://localhost:8080; }` 会将 `/api/test` 转发为 `http://localhost:8080/api/test`。理解这一行为对于调试路径错误至关重要。


















