如何通过NGINX Ingress Controller将example.com永久重定向至example.com/login
实现根路径永久重定向至/login的Ingress配置修改方案
针对你现有的NGINX Ingress配置,要实现访问http://example.com(根路径/)时永久重定向到http://example.com/login,可以用以下两种方案修改:
方案一:新增根路径专属规则(推荐)
在现有Ingress的paths列表最顶部添加一个精确匹配根路径的规则,利用NGINX Ingress的重定向能力实现需求。修改后的完整配置如下:
{{- $root := . -}} apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: {{ include "ingress.name" . }} namespace: demo annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: "*.{{ .Values.host }}" http: paths: # 根路径重定向规则,放在最前面确保优先匹配 - path: / backend: serviceName: dummy-service # 无需实际存在,重定向在NGINX层面完成 servicePort: 80 pathType: Exact # 精确匹配根路径,避免影响其他子路径 {{- range $index, $service := .Values.deployments }} - path: {{ $service.pathPrefix }}(/|$)(.*) backend: serviceName: {{ $service.deploymentName }} servicePort: 80 {{- end }} ---
细节说明:
pathType: Exact确保只有访问http://example.com(即请求路径为/)时触发重定向,不会干扰其他子路径的正常访问。dummy-service可以是任意名称,甚至不存在的服务——因为NGINX会在转发到后端之前执行重定向,不会实际请求该服务。- 如果你的
.Values.host就是example.com,也可以保持模板变量的一致性,无需硬编码域名。
如果不想修改原有Ingress,也可以单独创建一个负责根路径重定向的Ingress资源:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: root-redirect-ingress namespace: demo annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/permanent-redirect: /login spec: rules: - host: "example.com" http: paths: - path: / backend: serviceName: dummy-service servicePort: 80 pathType: Exact
方案二:通过配置片段实现重定向
直接在原有Ingress的注解中插入自定义NGINX配置,实现根路径的重定向:
{{- $root := . -}} apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: {{ include "ingress.name" . }} namespace: demo annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$2 # 新增根路径重定向的NGINX配置片段 nginx.ingress.kubernetes.io/configuration-snippet: | if ($request_uri = '/') { return 301 /login; } spec: rules: - host: "*.{{ .Values.host }}" http: paths: {{- range $index, $service := .Values.deployments }} - path: {{ $service.pathPrefix }}(/|$)(.*) backend: serviceName: {{ $service.deploymentName }} servicePort: 80 {{- end }} ---
细节说明:
configuration-snippet注解允许直接插入NGINX配置代码,这里通过判断请求URI是否为/,返回301永久重定向到/login。- 这种方式无需新增路径规则,但要注意NGINX中
if指令的使用限制——针对根路径的简单判断是安全的,不会引发问题。
注意事项
- 若你的NGINX Ingress Controller版本低于v0.21.0,不支持
pathType字段,可省略该字段,但必须保证根路径规则在paths列表的最前面,确保优先匹配。 - 若需要临时重定向(HTTP 302),可将方案一中的
permanent-redirect改为temporary-redirect,或方案二中的return 301改为return 302。
内容的提问来源于stack exchange,提问作者Jatin Panchal
相关产品推荐
相关产品推荐

