Это стандартные правила перезаписи, с которых я начинаю каждый проект. Я использую только чистые URL для всех страниц (пример: первое правило работает для www.example.com/about и второе правило www.example.com/product/123)
<rewrite>
<rules>
<rule name="Rewrite default to aspx" stopProcessing="true">
<match url="^$" ignoreCase="false" />
<action type="Rewrite" url="default.aspx" />
</rule>
<rule name="Rewrite page to aspx" stopProcessing="true">
<match url="^([a-z0-9/]+)$" ignoreCase="false" />
<action type="Rewrite" url="{R:1}.aspx" />
</rule>
</rules>
</rewrite>
Страницы, на которых мне нужно разобрать идентификатор (только этот номер дела) и добавить его в строку запроса. Я добавляю аналогичное правило на передний план:
<rule name="Rewrite Product ID" stopProcessing="true">
<match url="^product/([0-9]+)$" ignoreCase="false"/>
<action type="Rewrite" url="product.aspx?id={R:1}"/>
</rule>
Если вы хотите использовать строчные и прописные буквы в URL, установите ignoreCase = "true"
Изменить, чтобы ответить на второй вопрос плюс бонус
Это правило перенаправляет страницу aspx на чистый URL-адрес:
<rule name="Redirect to clean URL" stopProcessing="true">
<match url="^([a-z0-9/]+).aspx$" ignoreCase="true"/>
<action type="Redirect" url="{R:1}"/>
</rule>
Замените url = "{R: 1}" на url = "{ToLower: {R: 1}}", чтобы изменить URL на строчные. Ниже показано, почему вы хотите это сделать.
Также неплохо бы обновить действие формы, чтобы обратные ссылки не возвращались обратно к уродливому URL. При использовании IIS 7.5 или новее это должно работать:
if (!String.IsNullOrEmpty(Request.RawUrl))
form1.Action = Request.RawUrl;
или для IIS 7:
if (!String.IsNullOrEmpty(Context.Request.ServerVariables["HTTP_X_ORIGINAL_URL"]))
form1.Action = Context.Request.ServerVariables["HTTP_X_ORIGINAL_URL"];
Еще одна вещь, которую нужно иметь в виду ... это хорошая идея, чтобы все URL-адреса были строчными. Смешивание строчных и прописных букв в URL создает проблемы с дублированием контента для SEO / Google. Например, website.com/About и website.com/about загрузят одну и ту же страницу, но Google проиндексирует их как две отдельные страницы.