You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:46:10