能否禁用Yarp转发请求时的查询字符串编码?
如何让Yarp不对查询字符串中的反斜杠()进行编码?
要让Yarp和Kong保持一致,不对查询字符串中的\字符进行编码,可以通过自定义请求转换修改Yarp的默认行为,以下是两种可行方案:
方案一:直接转发原始查询字符串
跳过Yarp对查询字符串的编码处理,直接将客户端请求的原始查询字符串转发到后端:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")) .AddTransforms(context => { context.AddRequestTransform(transformContext => { // 将原始请求的查询字符串直接赋值给代理请求 transformContext.ProxyRequest.QueryString = transformContext.HttpContext.Request.QueryString; return Task.CompletedTask; }); }); var app = builder.Build(); app.MapReverseProxy(); app.Run();
该方案会完全保留客户端发送的查询字符串格式,所有特殊字符的处理逻辑与Kong一致,适合需要完全对齐Kong行为的场景。
方案二:仅还原反斜杠的编码结果
如果仅需针对\字符取消编码,其他字符仍保留Yarp的默认编码逻辑,可以将Yarp编码后的%5C替换回\:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")) .AddTransforms(context => { context.AddRequestTransform(transformContext => { var encodedQuery = transformContext.ProxyRequest.QueryString.Value; if (!string.IsNullOrEmpty(encodedQuery)) { // 将编码后的反斜杠替换回原始字符 var modifiedQuery = encodedQuery.Replace("%5C", "\\"); transformContext.ProxyRequest.QueryString = new QueryString(modifiedQuery); } return Task.CompletedTask; }); }); var app = builder.Build(); app.MapReverseProxy(); app.Run();
验证效果
配置完成后,发送请求http://localhost:5123/api/sample-controller/v0/sample?filter=smth\.smth,后端ASP.NET Core应用中的HttpContext.Request.QueryString.Value将返回filter=smth\.smth,与Kong的行为一致,无需修改遗留的自定义绑定器代码。
内容的提问来源于stack exchange,提问作者Marek Ott
相关产品推荐
相关产品推荐

