如何用ASP.NET Core + YARP为QlikSense配置子路径反向代理
解决方案:ASP.NET Core + YARP 反向代理 QlikSense 路径映射
1. 核心配置(appsettings.json)
通过双路由规则处理初始访问和后续路径映射,同时配置证书与响应头转换:
{ "ReverseProxy": { "Routes": { "qlik-subpath-route": { "ClusterId": "qlik-cluster", "Match": { "Path": "/qlik/{**catch-all}" }, "Transforms": [ { "PathRemovePrefix": "/qlik" }, { "RequestHeader": "X-Forwarded-Prefix", "Set": "/qlik" }, { "ResponseHeaderLocation": "Replace", "Pattern": "^https?://[^/]+(/.*)?$", "Replacement": "/qlik$1" } ] }, "qlik-root-route": { "ClusterId": "qlik-cluster", "Match": { "Path": "/qlik" }, "Transforms": [ { "PathSet": "/hub" }, { "RequestHeader": "X-Forwarded-Prefix", "Set": "/qlik" }, { "ResponseHeaderLocation": "Replace", "Pattern": "^https?://[^/]+(/.*)?$", "Replacement": "/qlik$1" } ] } }, "Clusters": { "qlik-cluster": { "Destinations": { "qlik-dest": { "Address": "https://你的QlikSense域名/" } }, "SslProtocols": ["Tls12", "Tls13"], "HttpClient": { "SslOptions": { "ClientCertificates": { "FileName": "你的证书路径/xxx.pfx", "Password": "证书密码" } } } } } } }
2. 服务注册与代理启用(Program.cs)
var builder = WebApplication.CreateBuilder(args); // 加载YARP配置并注册服务 builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); var app = builder.Build(); // 启用代理中间件 app.MapReverseProxy(); app.Run();
3. 关键规则说明
- 初始访问处理:单独配置
/qlik根路径路由,通过PathSet直接转发到QlikSense的/hub接口,解决初始404问题。 - 子路径转发:对
/qlik/{**catch-all}请求,移除/qlik前缀后转发,确保QlikSense识别自身路由。 - 重定向头修正:用
ResponseHeaderLocation规则将QlikSense返回的Location头中的域名部分替换为/qlik前缀,避免跳转到根路径的/hub。 - 证书配置:在集群HttpClient中指定.pfx证书,保证与QlikSense的HTTPS通信正常。
4. 自定义转换 fallback(可选)
如果内置Location转换不生效,可添加自定义转换器:
builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")) .AddTransforms<CustomLocationTransform>(); public class CustomLocationTransform : ITransformProvider { public void Apply(TransformBuilderContext context) { context.ResponseTransforms.Add(async context => { if (context.HttpContext.Response.Headers.TryGetValue("Location", out var locationValues)) { var location = locationValues.ToString(); if (!string.IsNullOrEmpty(location)) { var uri = new Uri(location); var newPath = $"/qlik{uri.PathAndQuery}"; context.HttpContext.Response.Headers["Location"] = newPath; } } await Task.CompletedTask; }); } }
内容的提问来源于stack exchange,提问作者user27302889
相关产品推荐
相关产品推荐

