Azure App Service中Docker-Compose+Nginx+Blazor SSL配置无限重定向求助
问题分析
无限重定向的核心原因是Blazor Server未正确识别来自Nginx的反向代理请求协议:
- Nginx已将HTTPS请求转发给Blazor(内部走HTTP协议),并通过
X-Forwarded-Proto传递了原始协议为https - 但Blazor未信任该反向代理,忽略了
X-Forwarded-Proto头,仍认为当前请求是HTTP,因此触发重定向到HTTPS,形成循环
排查与解决方案
1. 完善Blazor的ForwardedHeaders配置
仅开启ForwardedHeaders枚举不够,需明确信任反向代理(Nginx及Azure App Service的ARR代理)。修改Program.cs中的配置:
builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 信任Docker容器默认网络段 options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.17.0.0"), 16)); // 信任Azure App Service的ARR代理常见IP段 options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("13.107.6.152"), 32)); options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("13.107.18.12"), 32)); options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("13.107.64.0"), 18)); }); // 必须在构建应用后、其他中间件前启用ForwardedHeaders var app = builder.Build(); app.UseForwardedHeaders();
同时在docker-compose.yml的azuretest-web服务中添加环境变量,强制启用转发头:
environment: # 保留原有环境变量,新增以下配置 ASPNETCORE_FORWARDEDHEADERS_ENABLED: "true"
2. 优化Nginx配置
修正80端口重定向规则
避免在location块中使用if(Nginx中if存在逻辑隐患),直接在server块处理HTTP到HTTPS的重定向:
server { listen 80; server_name mydomainname.co.uk; # 全局重定向所有HTTP请求到HTTPS return 301 https://$server_name$request_uri; }
验证HTTPS代理头配置
当前HTTPS server块中的proxy_set_header X-Forwarded-Proto $scheme;配置正确(Nginx处理SSL时$scheme值为https),无需修改。
3. 检查Azure App Service的SSL设置
- 确认自定义域SSL绑定配置:若使用Nginx内置Let's Encrypt证书,需在Azure中选择SNI SSL绑定,并确保证书与Nginx中使用的一致
- 禁用Azure自带的HTTPS重定向功能:在App Service的「设置 > TLS/SSL设置」中,关闭「强制HTTPS」,避免与Nginx的重定向规则冲突
4. 验证容器通信
- 查看Nginx容器日志,确认是否能正常连接
azuretest-web:8000 - 查看Blazor容器日志,检查是否收到
X-Forwarded-Proto: https请求头,确认重定向触发原因
本地与Azure环境差异说明
本地Docker Desktop无额外反向代理层,Blazor默认信任本地网络,能正确识别X-Forwarded-Proto头;而Azure环境存在ARR代理,必须显式配置信任该代理,Blazor才能正确处理转发的协议信息。
内容的提问来源于stack exchange,提问作者PoorbandTony
相关产品推荐
相关产品推荐

