具体表现

前端按 /api/save 提交表单,后端只定义了 /api/save/,请求被 308 重定向后方法变成 GET,接口拿不到参数。

先判断哪一层出错

Flask 的严格斜杠规则对带斜杠的规则做重定向,浏览器在 308 后跟随新地址时方法语义被前端封装改写。判断时先分清是 Flask 路由斜杠 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。

操作步骤

  1. 统一前后端约定的路径写法,接口不要留尾斜杠
  2. 必要时用 strict_slashes 关掉自动跳转
  3. 用 curl 直接验证方法是否保持

对应的命令或配置片段如下,可直接复制:

@app.route('/api/save', methods=['POST'], strict_slashes=False)
def save():
    return {'ok': True}
# 验证
# curl -i -X POST http://127.0.0.1:5000/api/save

如果同一现象隔一段时间又出现,多半是某个定时任务或重启流程把配置覆盖回去了,顺手查一遍启动脚本。测试环境复现不了时,先对比两边的版本号和配置文件,差异往往就在被忽略的那几行里。

收尾检查

用 curl 带 -X POST 请求原路径,返回 200 且不再出现 308,接口能拿到表单字段。

作者 9823189