千家信息网

如何理解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安全错误 数据库的锁怎样保障安全 互联网与科技 江苏根荣互联网科技 万易互联网科技有限公司 互联网科技排名 菲比寻常互联网科技 长亮科技互联网金融 大白互联网科技 互联网金融和金融科技 太原新华互联网科技学校怎么样 链环科技传统企业怎么转型互联网 乌鲁木齐新华智原互联网科技学校 西安小鹰速贷互联网科技有限公司 工业互联网等科技实现智能化赋能 美国互联网科技实力 北京市互联网新科技 容联科技互联网电商 广州智享互联网科技 玉溪新华互联网科技怎么选 第三届互联网大会安防黑科技 互联网科技创业有什么好项目 互联网 科技 无锡溥仪互联网科技有限公司 互联网科技热点资讯 中国互联网有什么科技含量 广州新华互联网科技学校电竞方面 信承诺互联网科技有限公司 科技互联网公司两年变化 亚光科技低轨卫星互联网 10位科技互联网大佬 平安好医生打造互联网科技医疗
0