You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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规则,确保各自的资源引用被正确替换。

注意事项

  1. 确保Nginx Ingress Controller版本支持configuration-snippet和sub-filter注解(主流版本均支持)。
  2. 对于React SPA,若使用sub-filter,需确保构建后的页面中资源引用是绝对根路径格式(如/static/js/main.js),才能被正确替换。
  3. 测试时需清除浏览器缓存,避免旧的资源引用影响结果。

内容的提问来源于stack exchange,提问作者Magnus Ingwersen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:57:44