IIS CleanURLs using some of the available ISAPI filters.
There is a free version called ISAPI_Rewrite Lite that should get clean URLs working for IIS. Install that and insert these rewrite rules.
# Accept a url with the following extensions and pass them through unchanged.
RewriteRule (.*.gif|.*.png|.*.jpg|.*.pdf|.*.js|.*.css) $1 [I,L]
# Make URLs sane
RewriteRule /index.php.* $0 [I,L]
RewriteRule /(.*)\?(.*) /index.php\?q=$1&$2 [I,L]
RewriteRule /(.*) /index.php\?q=$1 [I,L]Next, add the following line to the end of your settings.php file for your site:
$conf['clean_url'] = 1; Translating Apache's rewrite rules
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
In plain English: If the REQUEST_FILENAME variable does not exist (not an existing file and not an existing directory) then apply the rule:
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]"
After much research this exact functionalty does not appear to exist in any ISAPI module for IIS. I think the following solution will help solve this issue. It probably works with most "ISAPI rewrite" modules (they just need the "stop the rewriting process" option).
With this approach you basically revert the "Apache Rewrite" logic. First define rules for known files/folders (like /themes/ ..etc..). Have those "matching rules" exit, so rules processing stops before going to the next rule. With mod_rewrite.dll you can do that with the option [l].
Here is what my rules file looks (so far) like (using mod_rewrite.dll):
RewriteRule ^/index.php\?q\=(.*)$ /index.php?q=$1 [l]
RewriteRule ^/themes/(.*)$ /themes/$1 [l]
RewriteRule ^/misc/(.*)$ /misc/$1 [l]
RewriteRule ^/(.*)$ /index.php?q=$1 [l]
Remember, you have to add an "exiting" rule for all known folders/files before hitting the final rule. The first rule is to avoid recursion and exit immediatly if the URL already has index.php?q=.
To better understand the Apache rules here are the definitions of the main options:
'last|L' (last rule)
Stop the rewriting process here and don't apply any more rewriting rules. Use this flag to prevent the currently rewritten URL from being rewritten further by following rules.
'qsappend|QSA' (query string append)
This flag forces the rewriting engine to append a query string part in the substitution string to the existing one instead of replacing it. Use this when you want to add more data to the query string via a rewrite rule.
REQUEST_FILENAME
The full local filesystem path to the file or script matching the request.
'-d' (is directory)
Treats the TestString as a pathname and tests if it exists and is a directory.
'-f' (is regular file)
Treats the TestString as a pathname and tests if it exists and is a regular file.
Note: Getting Apache running on MS Windows is not that bad (I had been delaying it for years). In reality it's a matter of a few hours to get going. http://www.sitebuddy.com aims to save you time in that endeavor.

See here for an updated
See here for an updated rules configuration for Drupal 5;
http://drupal.org/node/61367
And here for a complete walkthrough if you not that familiar with Drupal, IIS or ISAPI Rewrite;
http://www.iis-aid.com/articles/how_to_guides/using_drupal_clean_urls_wi...
----------------
Dominic Ryan
www.iis-aid.com
Updated for ISAPI Rewrite 3.x Lite
Using Drupal Clean URLs with IIS and ISAPI Rewrite Version 3
----------------
Dominic Ryan
www.iis-aid.com
reg exp issue
RewriteRule /(.*)\?(.*) /index.php\?q=$1&$2 [I,L]
This rule doesn't work for me with ISAPI Rewrite 3 Lite. It doesn't seem to recognize the escaped question mark. Seems to work fine with ISAPI Rewrite 2 however.
ISAPI_Rewrite 3 supports mod_rewrite syntax
So all the normal mod_rewrite rules should work, just make the rules root relative as if they were included in a conf file.
----
Josh Coady
http://jlcoady.net