使用Config中的重写器重写其中包含2个问号的URL

时间:2011-12-01 20:18:32

标签: .net url-rewriting dotnetnuke config

我不能在我的DotNetNuke站点中使用友好URL,而我想要使用的模块需要它。问题是,当他们发布到模块过程的第二部分时,他们会在“?ctlname = Step2”上进行操作,然后“?ctlname = Step3”进行下一步操作。所以......

网址最终会像这样:

的Default.aspx?标签= 123 * * ctlname =步骤2

我正在尝试通过重写URL来解决这个问题。这似乎应该有效,但不是。

<RewriterRule>
  <LookFor>.*/Default.aspx\?tabid=123(\?ctlname=.*)$</LookFor>
  <SendTo>~/Default.aspx?tabid=123&amp;ctlname=$1</SendTo>
</RewriterRule>

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

自从我使用它已经有一段时间,但Snapsis Pageblaster可能会有所帮助。 它本质上是缓存,优化您的性能,但它有另一个很酷的功能,可以在内容发送到客户端浏览器之前搜索/替换内容。因此,您可以使用它重写规则,并且如果您无法获取源代码,则可能能够清理这些URL。

如果他们正在使用?所有URL参数的标记然后我想,源代码将是可怕的。 ;)

答案 1 :(得分:0)

您无法使用siteUrls.config重写规则处理未重写的Url。

这是因为查询字符串在传递给处理每个正则表达式模式的规则引擎之前从路径中被剥离。

在UrlRewriteModule.cs中,您将找到如下代码:

string strQueryString = "";
if ((!String.IsNullOrEmpty(app.Request.Url.Query)))
{
   strQueryString = request.QueryString.ToString();
   requestedPath = requestedPath.Replace(app.Request.Url.Query, "");
}

然后,在页面的下方,你会发现:

//check for the existence of the LookFor value 
string pattern = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[ruleIndex].LookFor) + "$";
Match objMatch = Regex.Match(requestedPath, pattern, RegexOptions.IgnoreCase);

因此,你可以摆弄你发布的正则表达式,直到你睁眼,但它永远不会奏效。这是因为正则表达式模式是根据requestedPath值进行评估的,该值已经从中删除了查询字符串。

您需要一个重写解决方案,该解决方案发生在DNN Url Rewriter的上游,或者是Url Rewriter的自定义版本(我不推荐)。像IIS7 Url Rewrite那样可以在DNN之前操作Url甚至可以看到它。

但这也是向任何人控制代码停止使用非法Url字符的好时机,如果可能的话,那就是可能。