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

Flask应用通过Kubernetes Ingress访问移除rewrite-target后404问题咨询

原理说明

默认情况下,NGINX Ingress 会将用户请求的完整路径原样转发给后端Service,不会自动裁剪路径前缀。
你当前的Ingress规则匹配的路径前缀是/hello_service/,当你访问http://my.example.url/hello_service/时:

  • 若没有配置rewrite-target注解,Ingress转发给Flask应用的路径为/hello_service/,但你的Flask仅定义了根路径/的路由,没有匹配/hello_service/的规则,因此返回404。
  • 配置rewrite-target: /$1后,Ingress会提取path规则中(.*)分组匹配到的内容(即/hello_service/之后的路径部分),将转发路径重写为/$1,访问根路径时转发给Flask的路径就是/,因此可以正常匹配路由。

你看到的其他同类应用无需配置重写规则即可正常访问,通常是因为这类应用本身已经做了子路径适配,内置了对应前缀的路由规则,或者配置了自动识别反向代理路径前缀的逻辑。

可行解决方案

你可以根据业务场景选择以下任意一种方案,无需配置rewrite-target即可正常访问:

方案1:修改Ingress规则,调整路径匹配逻辑

如果当前域名仅部署这一个服务,不需要通过路径前缀拆分多个服务,可以直接将Ingress的路径匹配规则改为根路径:

spec:
  rules:
  - host: my.example.url
    http:
      paths:
      - path: /
        backend:
          serviceName: hello_service
          servicePort: 80

修改后直接访问http://my.example.url/即可访问应用,无需重写规则。

方案2:适配Flask应用的子路径路由

如果需要保留/hello_service的路径前缀,同时不使用重写规则,只需要给Flask应用统一添加路由前缀即可,有两种常用实现方式:

方式A:使用Blueprint统一添加前缀

修改hello_world.py代码,通过Blueprint配置统一的路径前缀:

from flask import Flask, Blueprint
import socket

app = Flask(__name__)
# 配置统一前缀为/hello_service
bp = Blueprint('hello', __name__, url_prefix='/hello_service')

@bp.route('/')
def hello():
    return 'Hello World from host "%s".\n' % socket.gethostname()

app.register_blueprint(bp)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080, debug=True)

修改后Flask即可匹配/hello_service路径的请求,Ingress移除重写规则即可正常转发。

方式B:通过环境变量配置SCRIPT_NAME

如果不想修改业务代码,可以在应用的Deployment配置中添加SCRIPT_NAME环境变量,Flask会自动识别该前缀作为路由根路径:

# 在Deployment的containers.env中添加如下配置
env:
- name: SCRIPT_NAME
  value: "/hello_service"

同时建议添加ProxyFix中间件处理反向代理的请求头,避免后续出现路径生成异常:

from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_prefix=1)

内容的提问来源于stack exchange,提问作者Kyle N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:09:01