KubernetesのnginxイングレスでブラウザのURLを保持しながら、サービスへのパスを書き換えようとしています。
私が必要なのはこれです:
http://example.com/path
=> http://service
http://example.com/path/bar
=> http://service/bar
http://example.com/path/file.css
=> http://service/file.css
つまり、/path
上流サーバーのルート(または別のURL)になります。
私が見るところ here から、これはproxy_passで末尾のスラッシュを使用して行われますが、nginx ingressにはこのオプションがないようです。
これはnginxの侵入の可能性がありますか?
Nginx Ingressで可能ですか?
はい、それを達成するために rewrite-target
を使用できます。
キャプチャグループを作成し、適切なサービスに送信します。以下はIngressの例です。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: "rewrite"
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http: example.com
paths:
- path: /foo(/|$)(.*)
backend:
serviceName: echo-svc
servicePort: 80
このIngressの定義では、
(.*)
によってキャプチャされたすべての文字がプレースホルダー$2
に割り当てられ、rewrite-target
アノテーションのパラメーターとして使用されます。
このイングレスは次のことを行います。
NGINXでは、正規表現は最初の一致ポリシーに従います。より正確なパスマッチングを可能にするために、ingress-nginxは、パスをロケーションブロックとしてNGINXテンプレートに書き込む前に、まず長さを降順に並べます。
例:
$ kubectl apply -f echo-ingress.yaml
ingress.networking.k8s.io/echo-ingress created
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
echo-ingress mydomain.com 35.188.7.149 80 48s
$ tail -n 1 /etc/hosts
35.188.7.149 mydomain.com
$ curl mydomain.com/foo/bar
{"path": "/bar",
...suppressed output...
"os": {"hostname": "echo-deploy-764d5df7cf-6m5nz"}
}
$ curl mydomain.com/foo
{"path": "/",
"os": {"hostname": "echo-deploy-764d5df7cf-6m5nz"}
}
質問があればコメントで知らせてください。