基于networking.k8s.io/v1的Nginx Ingress子路径反向代理及Referer配置问题
解决方案:单域名多子路径路由React SPA服务(Nginx Ingress networking.k8s.io/v1)
可以实现你的需求,以下是具体配置方案和替代方案:
方案一:基于$http_referer的重定向规则配置
利用Nginx Ingress的configuration-snippet注解,将你提到的referer规则插入到Ingress对应的Nginx配置中,同时为每个子路径服务配置独立的路由规则。
完整Ingress配置示例
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-app-ingress namespace: myapplication annotations: nginx.ingress.kubernetes.io/use-regex: "true" # 插入referer重定向规则,处理根路径资源请求 nginx.ingress.kubernetes.io/configuration-snippet: | if ($http_referer ~ "^https://[^/]+/app1/") { rewrite ^/(.*)$ /app1/$1 redirect; } if ($http_referer ~ "^https://[^/]+/app2/") { rewrite ^/(.*)$ /app2/$1 redirect; } spec: ingressClassName: nginx rules: - host: test.mytestdomain.com http: paths: # Application1 路由规则 - path: /app1(/|$)(.*) pathType: Prefix backend: service: name: app1-frontend port: number: 80 # Application2 路由规则 - path: /app2(/|$)(.*) pathType: Prefix backend: service: name: app2-frontend port: number: 80
配置说明
configuration-snippet:直接插入Nginx的if规则,当请求的referer来自/app1/或/app2/子路径时,将根路径的资源请求(如/styles.css)重定向到对应的子路径下(如/app1/styles.css)。- 每个服务的
path规则:匹配以/app1/或/app2/开头的请求,通过正则捕获组将子路径后的内容传递给服务,确保服务收到的是根路径格式的请求。
方案二:使用sub-filter替换页面资源引用(更可靠的替代方案)
如果担心referer头不可靠(比如用户直接在地址栏输入根路径资源),可以利用Nginx Ingress的sub-filter注解,直接修改SPA页面中的资源引用路径,将根路径的引用替换为对应子路径。
针对App1的Ingress配置片段示例
metadata: annotations: nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 # 替换页面中的根路径资源引用 nginx.ingress.kubernetes.io/sub-filter: 'href="/"' nginx.ingress.kubernetes.io/sub-filter-replacement: 'href="/app1/"' nginx.ingress.kubernetes.io/sub-filter: 'src="/"' nginx.ingress.kubernetes.io/sub-filter-replacement: 'src="/app1/"' # 若有其他资源引用类型(如link的rel属性),可继续添加sub-filter规则 spec: rules: - host: test.mytestdomain.com http: paths: - path: /app1(/|$)(.*) pathType: Prefix backend: service: name: app1-frontend port: number: 80
配置说明
sub-filter:匹配页面中以href="/"或src="/"开头的资源引用,将其替换为href="/app1/"或src="/app1/",页面加载后所有资源请求会直接指向子路径,无需依赖referer头。- 需为每个服务单独配置对应的sub-filter规则,确保各自的资源引用被正确替换。
注意事项
- 确保Nginx Ingress Controller版本支持
configuration-snippet和sub-filter注解(主流版本均支持)。 - 对于React SPA,若使用
sub-filter,需确保构建后的页面中资源引用是绝对根路径格式(如/static/js/main.js),才能被正确替换。 - 测试时需清除浏览器缓存,避免旧的资源引用影响结果。
内容的提问来源于stack exchange,提问作者Magnus Ingwersen
相关产品推荐
相关产品推荐

