I really like the IIS7 URL rewriting module and so far, it worked great for me.
There is one thing that I'm not sure how to do: I would like to permanently redirect all URLs that have encoded spaces (%20) in them to a URL that has the spaces replaced with a dash (-).
So this:
http://www.test.com/About%20Our%20Mission.aspx
should be redirected to this:
http://www.test.com/About-Our-Mission.aspx
Is that even possible with only regular expressions?
There's no way to do directly what you want.
You might settle for something like this:
^(.*)%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}
One of then nice things about .aspx is how easy it is to rewrite URLs with real code. Just add a little search and replace code to your web site's Global.asax file:
protected void Application_BeginRequest(object sender, EventArgs e)
{
string path = HttpContext.Current.Request.Path;
// Search and replace, RegEx, etc.
HttpContext.Current.RewritePath(path);
}
On IIS7, you have to add some entries in web.config to handle rewriting non .aspx URLs:
<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"/>
<!-- ... -->
The IIS7 URL rewriting module is great, but just because you have a hammer...
The same may be achieved in one rule with ISAPI_Rewrite 3 or Helicon Ape for any number of %20s:
RewriteBase /
RewriteRule ^(.*)%20(.*)$ $1-$2 [LP,R=301,L]
You can write Custom Rewrite Provider to do any manipulation you want with the original url. But that involves more than regular expression only. More details here.
Perhaps I'm mad, but this seems to work...
Use a URL_Rewrite rule using Regular Expressions with this pattern:
^(.*) (.*)
Redirect to
{R:1}-{R:2}
I've tested this with a single space or many spaces and it works fine for me using IIS 10. Note that it works just as well for %20
as it does for "
" in the URL string, cheers.