【问题标题】:How to rewrite url containing plus and special chracters?如何重写包含加号和特殊字符的url?
【发布时间】:2011-03-10 01:21:35
【问题描述】:

我们有一些需要重定向的传入 URL,但在处理包含加号 (+) 的 URL 时遇到了问题。

例如,任何传入的 URL 都必须重定向到新站点的主页:

/eng/news/2005+01+01.htm

应该被重定向到新站点的主页

/zh/

使用 UrlRewriter.net,我们设置了一个适用于“普通”URL 但不适用于上述情况的规则

<redirect url="~/eng/(.+)" to="/en/index.aspx" />

但是,如果我将传入的 URL 更改为

,它会正常工作

/eng/news/2005-01-01.htm

有什么问题,谁能帮忙?

【问题讨论】:

  • 为什么开头有~

标签: regex url-rewriting


【解决方案1】:

我不知道UrlRewriter.net,我不确定它使用哪种正则表达式语法。我根据 Perl 正则表达式给出了一些提示。

  1. 开头的~ 是什么?也许您的意思是^,即字符串的开头。
  2. (.+) 匹配任何重复一次或多次的字符;它与您想要的 + 符号不匹配

这是编写 (Perl) 正则表达式匹配以字符串 /eng/ 开头并包含 + 符号的 URL 的一种方法:

^\/eng\/.*\+.*

我希望这会有所帮助。

【讨论】:

  • UrlRewriter.net 使用 .NET 正则表达式语法 - 其中 . 确实 包含 + 字符 - 就像我经历过的所有其他正则表达式风格一样。跨度>
  • 此外,即使点不包括加号,当他有多个 + 字符时,使用 .*\+.* 也不起作用(如示例所示)。像[^\n]* 这样的东西会更简单
  • @Peter Boughton:你为什么说它不起作用?我认为确实如此:如果我执行perl -pi -e 'if (/^\/eng\/.*\+.*/) { print "yes\n"; } else { print "no\n"; }',并且我将/eng/news/2005+01+01.htm 作为输入,我将得到yes 作为输出。
  • 之所以有效,是因为. 确实包含+ 字符。如果您在示例表达式中将 . 更改为 [^+],它将不起作用(因为有两个 + 字符,并且只有一个经过测试/允许)。
  • .*.*\+.* 之间的唯一区别是后者必须至少包含一个 + 而前者可以包含任何内容(换行符除外,它应该'无论如何都不适用于 URL 重写)。
猜你喜欢
  • 2012-08-20
  • 2015-06-16
  • 2019-01-12
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2015-04-17
相关资源
最近更新 更多