Twilio POST请求被识别为GET致405错误的排查与解决咨询
核心原因分析
服务器将Twilio的POST请求识别为GET,大概率是请求在传输链路中被重定向导致方法变更,或是Twilio的Webhook配置存在疏漏,具体场景包括:
Twilio强制HTTPS重定向引发方法转换
Twilio默认要求Webhook使用HTTPS协议,若你配置的是HTTP地址,Twilio会自动发起重定向到HTTPS。而标准的301/302重定向会将POST请求转为GET,导致服务器收到的请求方法与你的POST路由不匹配,返回405错误。反向代理/服务器的重定向规则问题
若你的服务器(如Nginx)配置了强制HTTPS的重定向规则且使用301/302状态码,同样会触发POST转GET的问题。此外,反向代理若未正确传递请求方法头,也会导致FastAPI识别错误。Twilio Webhook请求方法配置错误
即便你确认URL正确,也可能忽略了Twilio控制台中Webhook的请求方法选项——Twilio允许选择GET或POST,若误选GET,自然会发送GET请求。
分步解决方法
1. 确认Twilio Webhook的请求方法
登录Twilio控制台,找到对应电话号码或服务的Webhook设置:
- 检查"Incoming Call"对应的Webhook是否选择了HTTP POST,而非GET;
- 同时确认URL以HTTPS开头,避免Twilio自动触发重定向。
2. 修复重定向规则(保留POST方法)
若必须使用HTTP转HTTPS的重定向,不要用301/302,改用307临时重定向(会保留原请求方法和内容):
- 以Nginx为例,修改配置:
server { listen 80; server_name your-domain.com; return 307 https://$host$request_uri; }
- 若直接用Uvicorn处理HTTPS,启动时绑定证书避免重定向:
uvicorn main:app --host 0.0.0.0 --port 443 --ssl-keyfile=./key.pem --ssl-certfile=./cert.pem
3. 配置反向代理正确传递请求信息
若用Nginx作为反向代理,确保配置中传递请求方法和转发头:
location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Method $request_method; # 关键:传递请求方法 }
同时启动Uvicorn时加上--proxy-headers参数,让FastAPI信任代理的转发头:
uvicorn main:app --host 0.0.0.0 --port 8000 --proxy-headers
4. 临时兼容方案(不推荐长期使用)
若暂时无法解决重定向问题,可临时给路由添加GET方法支持,规避405错误:
from fastapi import FastAPI, Response from fastapi.requests import Request app = FastAPI() @app.post("/incoming-call") @app.get("/incoming-call") async def incoming_call(request: Request): # 可根据需求区分处理GET/POST逻辑 return Response("Call received", status_code=200)
5. 验证请求真实性
使用Twilio的Request Inspector工具查看实际发送的请求详情,确认Twilio发送的是POST还是GET,以及请求是否被中间环节修改。
内容的提问来源于stack exchange,提问作者Ken Voiceai

