如何在Umbraco重写中停止自动转发查询字符串参数?
解决Umbraco/ASP.NET重写规则后链接自动附加cat参数的问题
这个问题我之前在做Umbraco项目的时候也碰到过,本质是ASP.NET的URL生成机制会自动保留当前请求的查询字符串参数——哪怕这个cat参数是通过重写规则隐式添加的,服务器端的请求上下文里依然存在这个参数,所以页面里的所有链接生成时都会自动带上它。下面给你几个可行的解决办法:
方法一:生成链接时显式清除cat参数
最直接的方式是在视图或代码里生成链接时,主动排除cat参数:
如果是用ASP.NET的
Url.Action方法生成控制器链接:// 显式设置cat为null,避免自动附加 @Url.Action("Category", "Home", new { cat = (string)null })如果是Umbraco内容节点的链接,使用
Url方法时指定不包含查询字符串:@Model.Url(mode: UrlMode.Absolute, includeQueryString: false)
这种方式适合你能控制链接生成代码的场景,精准解决单个或部分链接的问题。
方法二:通过中间件/HTTP模块移除请求上下文里的cat参数
如果希望全局解决这个问题,不让cat参数出现在任何后续的URL生成中,可以在重写完成后,从请求上下文里移除该参数:
针对ASP.NET Framework(传统Umbraco)
创建一个自定义HTTP模块:
public class RemoveCatParameterModule : IHttpModule { public void Init(HttpApplication context) { // 在重写路径完成后触发 context.PostRewritePath += (sender, e) => { var httpContext = ((HttpApplication)sender).Context; if (httpContext.Request.QueryString["cat"] != null) { // 复制现有查询参数并移除cat var newQuery = new NameValueCollection(httpContext.Request.QueryString); newQuery.Remove("cat"); // 更新请求的查询字符串 httpContext.Request.QueryString.Clear(); httpContext.Request.QueryString.Add(newQuery); } }; } public void Dispose() { } }
然后在web.config的<system.webServer>节点下注册这个模块:
<modules> <add name="RemoveCatParameterModule" type="YourNamespace.RemoveCatParameterModule" /> </modules>
针对ASP.NET Core(Umbraco 9+)
添加一个自定义中间件,放在重写中间件之后:
app.UseRewriter(); // 确保这行在你的重写规则配置之后 app.Use(async (context, next) => { if (context.Request.Query.ContainsKey("cat")) { // 移除cat参数并更新请求查询字符串 var queryDict = context.Request.Query.ToDictionary(q => q.Key, q => q.Value); queryDict.Remove("cat"); context.Request.Query = new QueryCollection(queryDict); } await next(); });
这样处理后,服务器端的请求上下文里就不会有cat参数了,所有链接生成时自然也不会附加它。
方法三:检查Umbraco路由配置
偶尔Umbraco的内容类型URL模式或路由缓存可能会意外保留参数,你可以:
- 进入Umbraco后台,检查对应内容类型的URL模式,确保没有包含
{cat}这类变量 - 清理Umbraco的路由缓存(后台设置里的"刷新路由缓存"选项)
内容的提问来源于stack exchange,提问作者Computer
相关产品推荐
相关产品推荐

