Nginx 路径重写rewrite 与 端口转发proxy_pass核心区别:
rewrite:URL 路径重写、地址跳转,改浏览器地址栏,侧重路径 / 域名规则修改;
端口转发(proxy_pass 反向代理):请求转发到后端服务,浏览器地址不变,侧重跨机器 / 跨端口分发流量。
一、基础定义与作用
1. rewrite 重写(地址改写 / 重定向)
属于 Nginx 的URL 规则匹配模块,操作请求 URI、域名,分两种模式:
内部重写(break/last)
仅在 Nginx 内部修改请求路径,浏览器无感知,地址栏不变;
外部重定向(redirect/permanent)
返回 302/301 给浏览器,浏览器重新发起新请求,地址栏会变。
适用场景:
路径兼容:
/user/123→ 内部转发/api/user?id=123旧域名跳转:
old.com301 跳转到new.com伪静态:
/article/1.html映射后端/article?id=1HTTPS 强制跳转:http 全部跳 https
示例:
nginx
# 301永久跳转,浏览器地址变化
rewrite ^/(.*)$ shturl.cc/lrCZsX$1 permanent;
# 内部重写,地址不变
rewrite ^/user/(.*)$ /api/user?uid=$1 break;
2. 端口转发 proxy_pass(反向代理)
属于 ngx_http_proxy_module 反向代理模块,把接收的 HTTP 请求完整转发到其他端口 / 其他服务器(本地 8080、内网 192.168:3000 等),标准端口转发实现。
浏览器只和 Nginx 通信,全程看不到后端真实端口 / 地址,地址栏不变;
可转发 TCP/UDP(stream 模块四层端口转发)、HTTP 七层代理。
适用场景:
本地多服务:Nginx 80 端口接收请求,转发给本地 SpringBoot 8080、Node 3000
内网服务暴露:公网 Nginx 转发请求到内网服务器端口
负载均衡:多后端服务分发流量
示例:
location /api/ {
# 转发到本机8080端口,标准端口转发
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
}
二、核心维度对比表
三、最容易混淆的场景:两者搭配使用
很多业务会同时用 rewrite + proxy_pass,分工完全不同:
需求:访问 http://domain.com/user/1,转发到本机 8080 的 /api/user?id=1
location /user/ {
# 1. rewrite:修改URL路径(只改地址字符串)
rewrite ^/user/(.*)$ /api/user?uid=$1 break;
# 2. proxy_pass:把修改后的请求转发到8080端口(端口转发)
proxy_pass http://127.0.0.1:8080;
}
rewrite 负责改路径;
proxy_pass 负责转发到别的端口,二者职责完全分开。
四、四层端口转发(stream)补充
如果是 TCP 原始端口转发(比如 8081 → 127.0.0.1:3306 数据库),用 stream {} 模块,完全没有 rewrite:
stream {
server {
listen 8081;
proxy_pass 127.0.0.1:3306; # 四层纯端口转发
}
}
rewrite 只能用于 HTTP 七层,四层 TCP 转发不支持 URL,自然无法使用 rewrite。
五、快速区分记忆
只想改网址、跳转域名、适配路径 → 用 rewrite
想把请求丢给另一个端口 / 另一台机器处理 → 用 proxy_pass(端口转发)
既要改路径,又要转发后端端口 → 两者组合使用