Nginx Ingress配置咨询:仅重定向根页面且保留指定路径的实现方案
嗨,我来帮你搞定这个Nginx Ingress的重定向问题!你现在的核心需求是让example.com的根请求重定向到different.site.com,但必须保留/.well-known/assetlinks.json这个路径不被重定向,对吧?之前的配置因为全局rewrite把所有请求都转走了,所以才会破坏App Links的验证,咱们来调整一下配置就能解决。
方案一:调整Rewrite规则,排除指定路径
你可以在configuration-snippet里给rewrite加个条件,只有当请求的URI不是/.well-known/assetlinks.json的时候,才执行根路径的重定向。这样就能精准避开需要保留的路径了。
修改后的Ingress配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: applinks-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod" kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/configuration-snippet: | if ($uri != "/.well-known/assetlinks.json") { rewrite ^/$ https://different.site.com permanent; } spec: ingressClassName: nginx tls: - hosts: - example.com secretName: applinks-tls rules: - host: example.com http: paths: - pathType: Exact path: / backend: service: name: applinks-service port: number: 80 - pathType: Exact path: /.well-known/assetlinks.json backend: service: name: applinks-service port: number: 80
这里的关键是把rewrite的匹配规则改成^/$(只严格匹配根路径),再加上if条件排除assetlinks的URI,这样就不会误重定向那个关键文件了。
方案二:利用Ingress路径优先级+定向重注解
另一种更清晰的方式是去掉全局的rewrite snippet,转而给根路径单独配置重定向注解。因为Ingress的路径是按顺序匹配的,精确匹配的路径优先级最高,所以把assetlinks的路径放在前面,根路径用专属注解处理重定向。
配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: applinks-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod" kubernetes.io/ingress.class: "nginx" spec: ingressClassName: nginx tls: - hosts: - example.com secretName: applinks-tls rules: - host: example.com http: paths: - pathType: Exact path: /.well-known/assetlinks.json backend: service: name: applinks-service port: number: 80 - pathType: Exact path: / backend: service: name: applinks-service port: number: 80 annotations: nginx.ingress.kubernetes.io/permanent-redirect: "https://different.site.com"
这个方案里,当请求匹配到/.well-known/assetlinks.json时,会直接转发到你的服务;而根路径/的请求会触发注解里的永久重定向,其他未匹配的路径(如果有的话)会按默认逻辑处理,完全不会影响assetlinks的访问。
小提示
应用配置后,可以用kubectl describe ingress applinks-ingress检查注解和路径是否生效,也可以用curl分别测试两个路径的响应:
- 测试根路径:
curl -I https://example.com,应该返回301重定向到目标站点 - 测试assetlinks:
curl -I https://example.com/.well-known/assetlinks.json,应该返回200正常响应
备注:内容来源于stack exchange,提问作者RonManning

