如何为Azure托管网站搭建联盟白标(Whitelabel)服务?
我帮你一步步解决这个Azure上搭建联盟白标服务的404问题,你遇到的核心问题是Azure Web App默认只处理已绑定的域名请求,加上还没配置针对第三方白标域名的自定义逻辑,下面是具体的配置和代码实现方案:
第三方域名(比如hello.example2.com)通过CNAME指向你的whitelabel.example.com后,Azure Web App因为没识别到这个陌生域名,直接返回404。这里有两种处理方式:
方式1:关闭主机名筛选(快速实现)
这是最简单的方式,让Web App接受所有传入的主机名请求:
- 登录Azure门户,找到你的Web App,进入「配置」→「常规设置」
- 找到「主机名筛选」,设置为「关闭」
- 保存配置,等待生效
⚠️ 注意:关闭后任何人都可以把域名CNAME到你的白标域名,所以一定要在后续代码中添加合法性验证,防止恶意流量。
方式2:用Azure Front Door做入口(更安全)
如果不想关闭主机名筛选,可以用Front Door作为统一入口,转发所有合法的白标请求到你的Web App,同时在Front Door里配置允许的域名规则。这种方式更安全,但配置稍复杂,适合有较多联盟用户的场景。
先确保联盟用户的DNS配置没问题:
- 让联盟用户将他们的域名(比如
hello.example2.com)的CNAME记录指向你的whitelabel.example.com - 用
nslookup hello.example2.com或dig hello.example2.com验证解析结果,确认最终指向你的example.com的IP地址
现在请求能到达你的Web App了,接下来用C#处理请求,识别联盟用户、验证合法性并执行定制逻辑。
1. 获取请求的主机名
在ASP.NET Core中,直接通过HttpContext.Request.Host就能拿到当前请求的域名,比如hello.example2.com。
2. 验证联盟用户的合法性
维护一个合法联盟用户的域名列表(可以存在appsettings.json或数据库中),请求过来时先校验:
// 在appsettings.json中配置合法域名 "AllowedWhitelabelDomains": [ "hello.example2.com", "partnerA.example3.com" ] // 在Controller或Middleware中验证 var allowedDomains = Configuration.GetSection("AllowedWhitelabelDomains").Get<List<string>>(); var requestHost = HttpContext.Request.Host.Host; if (!allowedDomains.Contains(requestHost)) { // 非法请求,返回403禁止访问 return Forbid(); }
3. 处理跳转或定制内容
根据你的需求,有两种常见处理方式:
方式A:跳转到主站并带联盟标识
如果希望用户跳转到你的example.com,同时带上联盟用户的标识(用于后续统计、佣金计算):
// 使用301永久重定向(利于SEO)或302临时重定向 return RedirectPermanent($"https://example.com?ref={Uri.EscapeDataString(requestHost)}");
方式B:显示定制化白标页面
如果要给不同联盟用户展示不同的页面(比如定制logo、内容),可以根据域名加载对应的配置:
// 从数据库或配置中获取该联盟用户的定制信息 var partnerSettings = await _partnerRepository.GetSettingsByDomain(requestHost); // 传递定制信息到视图 return View("WhitelabelHome", partnerSettings);
4. 全局Middleware处理(可选)
如果希望所有请求都经过白标逻辑处理,可以创建一个自定义Middleware:
public class WhitelabelMiddleware { private readonly RequestDelegate _next; private readonly IConfiguration _config; private readonly IPartnerRepository _partnerRepo; public WhitelabelMiddleware(RequestDelegate next, IConfiguration config, IPartnerRepository partnerRepo) { _next = next; _config = config; _partnerRepo = partnerRepo; } public async Task InvokeAsync(HttpContext context) { var requestHost = context.Request.Host.Host; var allowedDomains = _config.GetSection("AllowedWhitelabelDomains").Get<List<string>>(); // 跳过主站和自身白标域名,只处理联盟用户的域名 if (requestHost != "example.com" && requestHost != "whitelabel.example.com" && allowedDomains.Contains(requestHost)) { // 把联盟域名存入HttpContext,方便后续Controller/View使用 context.Items["PartnerDomain"] = requestHost; // 如果要直接跳转,取消下面注释 // context.Response.RedirectPermanent($"https://example.com?ref={Uri.EscapeDataString(requestHost)}"); // return; } await _next(context); } } // 在Program.cs中注册Middleware app.UseMiddleware<WhitelabelMiddleware>();
- 本地测试:修改本地
hosts文件(路径:C:\Windows\System32\drivers\etc\hosts或/etc/hosts),添加127.0.0.1 hello.example2.com,然后启动项目访问http://hello.example2.com,验证逻辑是否生效。 - Azure测试:部署代码后,用
curl -v https://hello.example2.com查看响应头,确认请求是否到达你的Web App,并且执行了自定义逻辑。 - 排查404:如果还是出现404,检查:
- Azure Web App的「自定义域名」是否绑定了
whitelabel.example.com - 「主机名筛选」是否已经关闭
- DNS解析是否正确
- Azure Web App的「自定义域名」是否绑定了
- 安全防护:关闭主机名筛选后,一定要在代码中验证合法域名,避免恶意流量攻击。
- SSL证书:如果联盟用户需要HTTPS访问,你需要在Azure Web App上配置通配符SSL证书,或者使用Azure Front Door的证书管理,确保所有请求都是HTTPS。
- SEO优化:如果使用跳转,优先用301永久重定向;如果是白标页面,尽量直接渲染定制内容,避免跳转影响SEO。
内容的提问来源于stack exchange,提问作者Jaruwitt A.

