Kubernetes中NGINX Ingress的$request_uri为何为空?
问题分析与解决
核心原因
你同时启用了nginx.ingress.kubernetes.io/from-to-www-redirect: 'true'和自定义的configuration-snippet规则,两者产生了冲突:
from-to-www-redirect是NGINX Ingress官方提供的专门用于非www到www重定向的注解,会自动生成包含路径、参数处理的完整重定向规则。- 自定义的
snippet规则和官方注解生成的规则在NGINX配置中互相干扰,导致$request_uri在你的自定义规则上下文里未被正确填充,最终出现空值。
另外你的rewrite规则写法也有瑕疵:rewrite ^ https://www.$request_uri permanent;中的^仅匹配空路径,带路径的请求也无法被正确捕获,但这不是本次$request_uri为空的主因。
解决办法
方法一:使用官方注解(推荐)
直接移除自定义的configuration-snippet,仅保留官方注解即可,它会自动处理所有路径和参数的重定向:
annotations: ... nginx.ingress.kubernetes.io/from-to-www-redirect: 'true'
这个注解会自动生成包含$request_uri的正确重定向规则,无需手动编写。
方法二:自定义规则(关闭官方注解)
如果必须使用自定义规则,先关闭官方的from-to-www-redirect,然后修正重定向规则,确保路径和参数正确传递:
annotations: ... # 注释或删除官方重定向注解 # nginx.ingress.kubernetes.io/from-to-www-redirect: 'true' nginx.ingress.kubernetes.io/configuration-snippet: | if ($host = 'example.com') { # 用正则捕获路径,确保完整跳转 rewrite ^(.*)$ https://www.example.com$1 permanent; # 或者更高效严谨的写法(处理带参数的场景): # return 301 https://www.example.com$uri$is_args$args; }
使用return指令比rewrite更高效,推荐优先采用return 301的写法。
内容的提问来源于stack exchange,提问作者awj
相关产品推荐
相关产品推荐

