一. 需求描述
路徑重定向的一般應(yīng)用場(chǎng)景:
- 調(diào)整用戶瀏覽的URL败许,看起來(lái)更規(guī)范
- 為了讓搜索引擎收錄網(wǎng)站內(nèi)容越平,讓用戶體驗(yàn)更好
- 網(wǎng)站更換新域名后
- 根據(jù)特殊的變量闸拿、目錄褐桌、客戶端信息進(jìn)行跳轉(zhuǎn)
我這里遇到的問(wèn)題是,以前的很多服務(wù)路徑配置不規(guī)范饼记,有的服務(wù)使用項(xiàng)目名作為二級(jí)路徑香伴,有的服務(wù)是隨意定義的訪問(wèn)路徑,為了統(tǒng)一使用項(xiàng)目名作為訪問(wèn)的二級(jí)路徑具则,避免修改代碼即纲,所以需要配置路徑重定向。
舉一個(gè)例子博肋,我有一個(gè) a 服務(wù)
低斋,它原來(lái)的訪問(wèn)路徑是 api/v1/apps
,現(xiàn)在我需要通過(guò)路徑 a/api/v1/apps
訪問(wèn)匪凡,需要將 a/
重定向到 /
膊畴。
也就是 www.test.com/a/api/v1/apps
重定向到 www.test.com/api/v1/apps
。
二. 解決方法
需要確保在集群中有一個(gè) ingress controller
正在運(yùn)行病游。我們可以按照如下方式配置 ingress
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: rewrite
namespace: default
spec:
ingressClassName: nginx
rules:
- host: www.test.com
http:
paths:
- path: /a(/|$)(.*)
pathType: Prefix
backend:
service:
name: http-svc
port:
number: 80
在這個(gè) ingress 的定義中唇跨,通過(guò)在 annotations
中指定了 nginx.ingress.kubernetes.io/rewrite-target: /$2
來(lái)進(jìn)行重定向,(.*)
捕獲的任何字符都將被分配給占位符 $2
衬衬,然后在 rewrite-target
中用作參數(shù)买猖。
應(yīng)用上面的 ingress 配置,可以實(shí)現(xiàn)下面的重定向:
-
www.test.com/a
重定向到www.test.com/
-
www.test.com/a/
重定向到www.test.com/
-
www.test.com/a/api/v1/apps
重定向到www.test.com/api/v1/apps
rewriting
可以使用下面的 anntations
進(jìn)行控制:
名稱 | 描述 | 值 |
---|---|---|
nginx.ingress.kubernetes.io/rewrite-target |
必須重定向流量的目標(biāo)URI | string |
nginx.ingress.kubernetes.io/ssl-redirect |
表示位置部分是否可訪問(wèn)SSL(當(dāng)Ingress包含證書(shū)時(shí)默認(rèn)為T(mén)rue) | bool |
nginx.ingress.kubernetes.io/force-ssl-redirect |
強(qiáng)制重定向到HTTPS滋尉,即使入口沒(méi)有啟用TLS | bool |
nginx.ingress.kubernetes.io/app-root |
定義應(yīng)用根政勃,如果它在'/'上下文中,控制器必須重定向它 | string |
nginx.ingress.kubernetes.io/use-regex |
表示Ingress上定義的路徑是否使用正則表達(dá)式 | bool |
App Root
創(chuàng)建一個(gè)帶有 nginx.ingress.kubernetes.io/app-root
注解的 ingress
兼砖,如下所示:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/app-root: /app1
name: approot
namespace: default
spec:
ingressClassName: nginx
rules:
- host: approot.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: http-svc
port:
number: 80
檢查 rewrite 是否起作用:
$ curl -I -k http://approot.bar.com/
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.11.10
Date: Mon, 13 Mar 2017 14:57:15 GMT
Content-Type: text/html
Content-Length: 162
Location: http://approot.bar.com/app1
Connection: keep-alive
參考文檔
https://github.com/kubernetes/ingress-nginx/blob/main/docs/examples/rewrite/README.md
https://www.cnblogs.com/brianzhu/p/8624703.html