易君召
易君召
发布于 2026-07-21 / 1 阅读
0
0

Nginx 路径重写rewrite 与 端口转发proxy_pass核心区别

Nginx 路径重写rewrite 与 端口转发proxy_pass核心区别:

  • rewrite:URL 路径重写、地址跳转,改浏览器地址栏,侧重路径 / 域名规则修改

  • 端口转发(proxy_pass 反向代理):请求转发到后端服务,浏览器地址不变,侧重跨机器 / 跨端口分发流量

一、基础定义与作用

1. rewrite 重写(地址改写 / 重定向)

属于 Nginx 的URL 规则匹配模块,操作请求 URI、域名,分两种模式:

  1. 内部重写(break/last)

    仅在 Nginx 内部修改请求路径,浏览器无感知,地址栏不变;

  2. 外部重定向(redirect/permanent)

    返回 302/301 给浏览器,浏览器重新发起新请求,地址栏会变

适用场景:

  • 路径兼容:/user/123 → 内部转发 /api/user?id=123

  • 旧域名跳转:old.com 301 跳转到 new.com

  • 伪静态:/article/1.html 映射后端 /article?id=1

  • HTTPS 强制跳转: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 端口 / 反向代理

核心能力

修改请求URL、域名、路径

转发完整请求到其他 IP + 端口

浏览器地址栏

外部跳转 (301/302) 会变;内部重写不变

永远不变,用户看不到后端端口

网络行为

外部跳转:两次 HTTP 请求

内部重写:单次请求

单次请求,Nginx 充当中间层

是否跨端口

本身不能跨端口,只能搭配 proxy_pass 才可以

原生支持跨端口、跨服务器

层级

七层 URL 路径处理

七层 HTTP 代理 / 四层 TCP 端口转发

典型用途

伪静态、域名跳转、路径兼容、HTTPS 跳转

前后端分离、多服务端口统一、内网暴露

依赖模块

ngx_http_rewrite_module

ngx_http_proxy_module / ngx_stream_module

三、最容易混淆的场景:两者搭配使用

很多业务会同时用 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。

五、快速区分记忆

  1. 只想改网址、跳转域名、适配路径 → 用 rewrite

  2. 想把请求丢给另一个端口 / 另一台机器处理 → 用 proxy_pass(端口转发)

  3. 既要改路径,又要转发后端端口 → 两者组合使用


评论