Nginx代理DigitalOcean App Platform返回403 Cloudflare错误
返回的Cloudflare 403错误是DigitalOcean App Platform(以下简称DO App Platform)边缘层的Host白名单校验拦截导致,和自有Nginx服务器的配置逻辑无关。
DO App Platform默认接入Cloudflare提供WAF、CDN能力,所有访问*.ondigitalocean.app默认域名的请求,边缘层会校验请求携带的Host头:仅当Host值属于当前应用已绑定的域名列表(包含平台分配的默认*.ondigitalocean.app域名、用户在控制台手动添加并完成校验的自定义域名)时才会转发到后端应用,否则直接在边缘层返回403 Permission Denied。
添加proxy_set_header Host $host配置后,Nginx转发到DO的请求Host从默认的my-app-platform-app.ondigitalocean.app变成了自有域名mydomain.com,但没有在DO App Platform控制台将该域名添加为应用的绑定域名,Host不在白名单内,因此触发拦截。
根据业务需求二选一即可:
- 方案1:保留Host头为DO默认域名,自定义头透传原始访问域名
如果不需要后端应用直接收到自有域名作为Host,仅需要业务逻辑能拿到用户实际访问的域名,不需要修改转发的Host头,额外添加自定义头传递原始请求信息即可,不会触发WAF拦截,参考配置:
后端.NET服务中直接读取location /api { proxy_pass https://my-app-platform-app.ondigitalocean.app; proxy_http_version 1.1; # 显式指定转发给DO的Host为平台默认域名,避免被Nginx默认规则修改 proxy_set_header Host my-app-platform-app.ondigitalocean.app; # 透传原始访问域名、客户端IP、协议给后端 proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }X-Forwarded-Host头即可获取用户访问的真实自有域名。 - 方案2:在DO侧添加自定义域名到白名单
如果必须让后端应用收到的Host头就是自有域名,登录DO App Platform控制台,进入对应应用的设置页面,找到「Domains」管理项,添加mydomain.com作为应用自定义域名,按照平台提示完成域名所有权校验即可。注意:由于是通过自有Nginx反向代理访问应用,不需要按照DO的提示将域名解析到平台提供的CNAME地址,仅需要完成所有权校验步骤,平台就会将该域名加入Host白名单,之前配置的
proxy_set_header Host $host即可正常生效,不会再触发403拦截。
当前配置的location /api规则在搭配不带路径后缀的proxy_pass时,Nginx会将完整的/api/xxx路径原样转发到DO端的应用。如果DO应用内接口路径本身没有/api前缀,需要调整配置做路径重写,避免出现接口404问题,参考配置:
location /api/ { # proxy_pass末尾加斜杠,会自动剥离匹配的/api前缀再转发 proxy_pass https://my-app-platform-app.ondigitalocean.app/; proxy_http_version 1.1; proxy_set_header Host my-app-platform-app.ondigitalocean.app; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
内容的提问来源于stack exchange,提问作者Jason White

