IIS7 URL重写模块替换

4

你最终解决了这个问题吗,而不需要一堆规则?我有同样的问题,正在寻找解决方案。 - jpkeisala
不,没有简单的方法可以做到这一点。我选择了被接受的答案。 - Stefan
5个回答

6

无法直接实现您想要的功能。

您可以尝试以下解决方案:

^(.*)%20(.*)%20(.*)%20(.*)  replaced by:  {R:1}-{R:2}-{R:3}-{R:4}
^(.*)%20(.*)%20(.*)         replaced by:  {R:1}-{R:2}-{R:3}
^(.*)%20(.*)                replaced by:  {R:1}-{R:2}

这就是我当前拥有的(请注意,%20在IIS Rewrite中被解释为空格):模式: (\w+)\s+(\w+)\s+(\w+)\s+(\w+.aspx)重定向URL: {R:1}-{R:2}-{R:3}-{R:4}效果还不错,但我也有像About%20Us/Blah%20Dah.aspx这样的路径。我需要一大堆规则来处理所有可能的空格。 - Stefan
2
如果您按2的幂次方递减计数,而不是逐个计数,并允许处理后续规则,则不需要太多规则。例如,像上面那样匹配16个空格、8个空格、4个空格、2个空格、1个空格的规则。按照这个顺序使用它们,它们将匹配任意数量的空格,最多可达31个,并且只需5个规则即可完成,而不是31个规则。 - jproch
@jproch 很好的想法。我认为@JeremyStein的答案总体上是解决令人沮丧的问题的好方法。如果你对你的URL长度和可能出现的%20数量保持现实,你可以用一些易于实现的规则来覆盖所有情况。然后你就不必走编写自定义请求处理程序/ URL重写器的路线,这是另一个需要维护的东西。 - theyetiman

2

.aspx的好处之一就是使用真实代码轻松重写URL。只需在您网站的Global.asax文件中添加一些搜索和替换代码:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    string path = HttpContext.Current.Request.Path;
    // Search and replace, RegEx, etc.
    HttpContext.Current.RewritePath(path);
}

在IIS7上,您需要在web.config中添加一些条目来处理重写非.aspx网址:
<system.webServer>
    <handlers>
        <clear/>
        <add name="Brands1" path="Brands/*.html" verb="*" type="ASP.global_asax" resourceType="Unspecified"/>
        <add name="Brands2" path="Brands/\?*.html" verb="*" type="ASP.global_asax" resourceType="Unspecified"/>
        <!-- ... -->

虽然 IIS7 URL 重写模块非常好用,但仅凭一把锤子还不够...


1

可以使用ISAPI_Rewrite 3或Helicon Ape的一条规则来实现任意数量的%20:

RewriteBase /
RewriteRule ^(.*)%20(.*)$ $1-$2 [LP,R=301,L]

1

您可以编写自定义重写提供程序来对原始URL进行任何操作。但这不仅涉及正则表达式。更多细节在此处


0

也许我有点疯狂,但这似乎有效...

使用此模式的正则表达式URL重写规则:

^(.*) (.*)

重定向到

{R:1}-{R:2}

我已经测试过单个空格或多个空格,并且在使用IIS 10时它可以正常工作。请注意,对于URL字符串中的%20和""同样适用,干杯。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接