FastAPI TrustedHostMiddleware拒绝客户端IP访问问题求助
问题描述
本地开发阶段,把127.0.0.1设为可信主机后,能正常访问/docs路由。但部署到服务器后,用自己电脑的IP访问/docs时被拒绝。已经通过多个网站和request.client.host确认过IP信息,还是没法访问该路由,只有设置trusted_hosts = ["*"]时才能正常访问,但这种配置明显不安全。
现有代码
from fastapi import FastAPI from fastapi.middleware.trustedhost import TrustedHostMiddleware app = FastAPI() # 定义可信主机列表 trusted_hosts = [ "my_ip_address" ] # 给应用添加TrustedHostMiddleware中间件 app.add_middleware(TrustedHostMiddleware, allowed_hosts=trusted_hosts)
解决方案
- 先搞清楚TrustedHostMiddleware的作用:这个中间件校验的是请求头里的
Host字段,不是发起请求的客户端IP。你之前把自己电脑的IP填进去完全搞错了,它管的是用户访问时用的域名/服务器主机名,不是你的电脑IP。 - 正确配置allowed_hosts:
- 如果直接用服务器公网IP访问,就把服务器的公网IP加到列表里,比如
["123.45.67.89"] - 如果用域名访问,就填对应的域名,比如
["example.com", "www.example.com"] - 要是服务器前面有Nginx这类反向代理,得确保代理把原始
Host头传递给FastAPI,同时可以配合TrustMiddleware信任代理IP,再把实际的访问域名/服务器IP加进allowed_hosts
- 如果直接用服务器公网IP访问,就把服务器的公网IP加到列表里,比如
- 排查实际的Host头:可以在服务器上临时加个测试接口,确认请求实际带的
Host值是什么:
from fastapi import Request @app.get("/check-host") async def check_host(request: Request): return {"host": request.headers.get("Host")}
访问这个接口拿到返回的host值,把它加到trusted_hosts列表里就能解决问题。
内容的提问来源于stack exchange,提问作者Testing man
相关产品推荐
相关产品推荐

