Nginx反向代理调用Notion API遭Cloudflare返回403/421错误求助
解决Notion API反向代理403/421错误的方案
核心问题分析
Cloudflare对Notion API的请求有严格的验证机制,生产环境Nginx代理时容易因为请求头缺失、SNI配置不全、协议标识错误触发403或421错误,以下是针对性的修复步骤:
1. 强制传递正确的Host头
Cloudflare会校验请求的Host字段是否匹配Notion API域名,必须显式设置:
proxy_set_header Host api.notion.com;
2. 完善SSL代理配置(即使Nginx用HTTP)
虽然Nginx和外部负载均衡用HTTP通信,但代理到Notion的HTTPS接口时,必须指定SNI参数:
proxy_ssl_name api.notion.com; proxy_ssl_server_name on; # 同时指定安全的SSL版本和加密套件 proxy_ssl_protocols TLSv1.2 TLSv1.3; proxy_ssl_ciphers HIGH:!aNULL:!MD5;
3. 传递原始请求的协议/来源信息
外部负载均衡处理了SSL,需要让Notion API知晓请求的真实协议,避免被判定为异常:
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Host $host;
4. 临时禁用代理缓存(排查用)
缓存的旧请求头可能导致验证失败,可临时关闭缓存:
proxy_cache_bypass $http_pragma; proxy_no_cache $http_pragma; proxy_no_cache $http_cache_control;
完整可用的Nginx配置示例
将以上配置整合到你的代理location块中:
server { listen 80; server_name your-app-domain.com; location /notion-proxy/ { # 如果你的应用通过前缀转发请求,重写路径去除前缀 rewrite ^/notion-proxy/(.*)$ /$1 break; proxy_pass https://api.notion.com; # 核心请求头配置 proxy_set_header Host api.notion.com; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Host $host; # 关键SSL代理参数 proxy_ssl_name api.notion.com; proxy_ssl_server_name on; proxy_ssl_protocols TLSv1.2 TLSv1.3; proxy_ssl_ciphers HIGH:!aNULL:!MD5; # 禁用缓存(排查阶段可加,稳定后可移除) proxy_cache_bypass $http_pragma; proxy_no_cache $http_pragma; proxy_no_cache $http_cache_control; } }
额外排查方向
- 检查外部负载均衡是否过滤了某些请求头,比如是否保留了
Authorization头(Notion API需要这个鉴权) - 确认生产环境的Notion API密钥和开发环境一致,403也可能是密钥无效或权限不足
- 查看服务器的请求日志,确认所有头信息是否正确传递到Notion API
内容的提问来源于stack exchange,提问作者S. Yong
相关产品推荐
相关产品推荐

