IIS7 URL Rewrite breaks for URLs containing + characters

iisiis-7.5rewrite

I have an IIS7 server that acts as a reverse proxy for several other web servers. The other servers run on different ports, so the IIS7 server provides 'friendly URLs' and all on port 80. URL rewriting is used to hand the request off to the back-end server.

One such server is TeamCity (continuous integration and build server). This server provides a way to download the results of a build ('build artifacts'). Typically these artifacts are a zip archive. Here's an example URL:

http://build.teamserver.tigranetworks.co.uk/repository/download/bt25/4164:id/ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip

The + characters in ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip are actually spaces in the final filename; the TeamCity server puts in the + characters.

When this link is clicked, I receive the following error from the IIS7 server:

404 – File or directory not found.

The resource you are looking for might have been removed, had its name
changed, or is temporarily unavailable.

The actual URL appearing in the IIS7 logfile is:

/repository/download/bt25/4164:id/ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip

The rewrite rule matches the pattern (.*) and rewrites the URL using

http://localhost:8022/{R:1}

Now here is the interesting thing. If I go back to my browser and edit out those + characters, carefully replacing them with spaces, then the URL works!

I conclude that the URL rewriting is somehow not working for those + characters. Is this a known issue? Any suggestions?

Best Answer

The '+' symbol is really not valid URL encoding for a space. TeamCity should be encoding them as %20.

Either way, the error is probably a result of a common requestFiltering security setting in IIS7.

Try the following command:

%windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true

It should stop IIS from returing 404's for anything with a + in the URL.