千家信息网

如何理解nginx rewrite和nginx-ingress rewrite

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章将为大家详细讲解有关如何理解nginx rewrite和nginx-ingress rewrite,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解
千家信息网最后更新 2026年11月03日如何理解nginx rewrite和nginx-ingress rewrite

这篇文章将为大家详细讲解有关如何理解nginx rewrite和nginx-ingress rewrite,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

在nginx的配置里面有个 proxy_pass 指令

location /name/ {    proxy_pass http://127.0.0.1/remote/;}

像这样的配置,proxy_pass 后面加了uri /remote, 会将正常请求uri中与location匹配的部分用/remote替换掉,我有个类似的场景是:访问 aa.xxx.net/gateway/a/b 代理到后端的是类似于访问 svc-gateway:8080/a/b ,要怎么配置?截掉其中的gateway。首先想到的是用ingress里面的rewrite注解来解决问题。

nginx的rewrite

参考官方文档 链接
ngx_http_rewrite_module模块使用PCRE正则表达式更改请求URI,返回重定向或者有条件地选择配置。
break, if, return, rewrite, and set指令按照下面的顺序执行:

  1. server块按照顺序执行

  2. 执行匹配到的location块内的该模块指令

  3. 循环重定向最多10次

break 指令

停止处理当前的ngx_http_rewrite_module指令集。如果在location内的if指令内包含break,则在location内的其他指令继续执行。

rewrite指令
Syntax: rewrite regex replacement [flag];Default:    -Context:    server, location, if

如果指定的正则匹配请求的uri,uri将被replacement替换。rewrite按照在配置文件里面出现的顺序执行。如下示例:

location / {    rewrite ^/a /b;    #return 200 okokok;    rewrite ^/b /c last;    rewrite ^/d /b;}location = /b {    return 401;}location = /c {    return 402;}

像上面这种配置,访问localhost:port/d 会返回401
rewrite 不指定flag,则会继续往下执行
可以用flags选项终止处理后面的指令。如果replacement以http://、https:// 或$scheme开头,则请求不会往后执行,redirect将直接返回给客户端

flag选项
    1、last 停止处理当前 ngx_http_rewrite_module 指令集,且用替换过的uri重新匹配新的location    2、break 选项和break指令的效果一样,不再匹配新的location    3、redirect,replacement不以 'http://' 等开头的时候,返回临时重定向302    4、permanent,返回永久重定向301

完整的重定向url按照请求的scheme和server_name_in_redirect和port_in_redirect 指令格式生成的

nginx-ingress里面的rewrite注解

官方链接
示例:

...    nginx.ingress.kubernetes.io/rewrite-target: /$1...spec:  rules:  - host: aa.xxx.net    http:      paths:      - backend:          serviceName: svc-gateway          servicePort: 8080        path: /gateway/(.*)      - backend:          serviceName: svc-ui          servicePort: 80        path: /(.*)  tls:  - hosts:    - aa.xxx.net    secretName: xxx.net

在版本0.22.0或更高版本中,需要传递到重写路径的请求URI中的任何子字符串都必须在捕获组中显式定义。第一个组用$1 表示,可以作为rewrite-target的参数。
使用了rewrite-target注解后,所有path被强制使用忽略大小写的正则,类似于nginx配置里面的:

location ~* "^/foo/.*" {  ...}

spec.rules.host 字段不像nginx一样支持范匹配和正则,必须写完整的域名
为了实现更精确的路径匹配,ingress-nginx在将路径作为location块写入nginx模板之前,首先按长度对路径降序排序,长度里面包含正则字符。和nginx一样,正则模式下先匹配到的location会直接执行,不往下继续匹配。

扩展阅读:ingress-path-matching
Understanding Nginx Server and Location Block Selection Algorithms

第二种方式:

...    kubernetes.io/ingress.class: nginx    nginx.ingress.kubernetes.io/server-snippet: |      if ($uri ~* "/gateway/.*") {          rewrite ^/gateway/(.*) /$1 break;      }    nginx.ingress.kubernetes.io/use-regex: "true"...spec:  rules:  - host: aa.xxx.net    http:      paths:      - backend:          serviceName: svc-gateway          servicePort: 8080        path: /gateway(/|$)(.*)      - backend:          serviceName: svc-gateway          servicePort: 8080        path: /(admin|bg|auth|monitor)      - backend:          serviceName: svc-ui          servicePort: 80        path: /  tls:  - hosts:    - aa.xxx.net    secretName: xxx.net

nginx.ingress.kubernetes.io/server-snippet 注解用于在server块自定义配置,可以写nginx的配置实现更多需求。每个server块只能用一次。用此方式实现了类似proxy_pass的需求

关于如何理解nginx rewrite和nginx-ingress rewrite就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

指令 配置 正则 注解 路径 更多 顺序 处理 内容 字符 官方 开头 文章 方式 模块 版本 知识 示例 篇文章 链接 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 保险科技 互联网保险 上海睿民互联网科技有限公司 互联网科技深圳 与互联网科技公司 鑫亿盛互联网科技 上海卓越科技 互联网 互联网巨头投资的硬核科技 青海省互联网新科技 科技与互联网的利与弊 互联网校园科技培训 佳云科技和互联网广告 全球顶尖互联网科技公司 崇明区互联网教育科技诚信经营 明优互联网科技有限公司 山东子淼互联网科技有限公司 广东工业互联网大赛深圳学泰科技 西安有哪些互联网高科技企业 陕西九四连强互联网科技有限公司 互联网领先科技活动 互联网科技职业技能培训学校 互联网与科技 互联网与新科技 迪茉互联网科技 汉立互联网科技有限公司联系电话 栖莱科技互联网股份有限公司 互联网校园科技培训 山东有哪些互联网科技公司 科技互联网行业投资研究 平安好医生打造互联网科技医疗 互联网科技企业文化
0