IIS URL Rewrite 的配置主要通过一个名为 web.config 的 XML 文件来完成,所有的“参数”都定义在这个文件 <rewrite> 节点下的规则(<rule>)中。

(图片来源网络,侵删)
一个完整的规则通常包含以下核心部分:
<match>: 定义要匹配的 URL 模式,这是规则的触发条件。<conditions>: (可选) 定义一组附加条件,只有当所有条件都满足时,规则才会执行。<action>: 定义当规则匹配成功后要执行的操作,例如重写 URL 或重定向到另一个 URL。
下面我们逐一解析这些核心元素及其参数。
<rule> 元素:规则本身
这是整个重写逻辑的容器。
主要属性:

(图片来源网络,侵删)
| 属性名 | 描述 | 示例 |
|---|---|---|
name |
必填,规则的名称,用于在管理界面中识别和调试。 | <name="Rewrite to Product Details"> |
enabled="true|false" |
指定规则是否启用,默认为 true。 |
<enabled="true"> |
stopProcessing="true|false" |
非常重要,如果设置为 true,当一个请求被此规则成功处理后,IIS 将停止处理后续所有规则,如果为 false(默认),IIS 会继续检查其他规则。 |
<stopProcessing="true"> |
<match> 元素:匹配 URL 模式
这是规则的“触发器”,它定义了什么样的 URL 请求会进入这个规则。
主要属性:
| 属性名 | 描述 | 示例 |
|---|---|---|
url |
必填,定义要匹配的 URL 模式,它可以使用通配符或正则表达式。 | <match url="^product/(\d+)$" /> |
ignoreCase="true|false" |
指定匹配是否区分大小写,在 Windows 服务器上,文件系统本身不区分大小写,所以通常设置为 true,默认为 true。 |
<match url="^product/(\d+)$" ignoreCase="true" /> |
url 属性的模式语法:
- *`
**: 匹配任意数量的任意字符(除路径分隔符/` 外)。- 示例:
*.aspx匹配所有.aspx文件。
- 示例:
- : 匹配任意单个字符。
- 示例:
photo?.jpg匹配photo1.jpg,photoa.jpg。
- 示例:
- : 匹配任意数量的 字符。
- 示例:
files/#/download匹配files/download,files/folder1/folder2/download。
- 示例:
<content>: 匹配查询字符串中的一个参数,语法为<parameter_name>.- 示例:
<match url="page.aspx<content>" />会匹配page.aspx?id=123,id=123会被捕获。
- 示例:
- 正则表达式: 如果模式以
^开头,则会被视为正则表达式,这是最强大和最常用的方式。^: 匹配字符串的开始。- 匹配字符串的结束。
- 创建一个捕获组,用于在
<action>中引用。 \d: 匹配任意数字 (0-9)。- 匹配前面的元素一次或多次。
- 匹配前面的元素零次或多次。
- 匹配前面的元素零次或一次。
- 匹配任意单个字符。
\s: 匹配空白字符。
示例:
<match url="^product/(\d+)/?$" />
^: 匹配 URL 的开头。product/: 匹配文本 "product/"。(\d+): 创建第一个捕获组,匹配一个或多个数字(如 123)。- 匹配零个或一个 字符(使末尾的斜杠可选)。
- 匹配 URL 的结尾。
- 整体效果: 匹配
/product/123或/product/123/这样的 URL。
<conditions> 元素:附加条件
只有当 <match> 成功并且所有 <conditions> 都满足时,规则才会执行 <action>。
<conditions> 元素属性:
| 属性名 | 描述 | 示例 |
|---|---|---|
logicalGrouping="MatchAll|MatchAny" |
非常重要,定义条件之间的关系。 - MatchAll (默认): 所有条件都必须为真,规则才执行。- MatchAny: 只要有一个条件为真,规则就执行。 |
<conditions logicalGrouping="MatchAll"> |
trackAllCaptures="true|false" |
指定是否在正则表达式中使用非命名捕获组,通常保持默认 false 即可。 |
<conditions trackAllCaptures="false"> |
<add> 子元素 (定义单个条件):
| 属性名 | 描述 | 示例 |
|---|---|---|
input="{HTTP_HOST}" |
必填,要检查的字符串,可以是服务器变量(如 {HTTP_HOST}, {REQUEST_URI}, {HTTPS})、匹配组(如 {R:1})或固定文本。 |
<add input="{HTTP_HOST}" /> |
pattern="^www\.example\.com$" |
必填,要匹配的模式,同样支持通配符和正则表达式。 | <add input="{HTTP_HOST}" pattern="^www\.example\.com$" /> |
ignoreCase="true|false" |
指定此条件是否区分大小写,默认为 true。 |
<add input="{HTTP_HOST}" pattern="^www\.example\.com$" ignoreCase="true" /> |
negate="true|false" |
非常实用,如果设置为 true,则条件逻辑取反,即,原条件为“不匹配”时才满足,默认为 false。 |
<add input="{HTTPS}" pattern="^OFF$" negate="true" /> (表示如果 HTTPS 为 OFF,则条件满足) |
常用服务器变量:
{HTTP_HOST}: 请求的域名和端口号,如www.example.com:8080。{REQUEST_URI}: 请求的完整路径,包括查询字符串,如/products/list?id=5。{URL}: 不包括查询字符串的请求路径,如/products/list。{HTTPS}: 如果连接是安全的,值为ON,否则为OFF。{QUERY_STRING}: 查询字符串部分,如id=5&sort=asc。{R:0},{R:1}, ...: 引用<match>或<conditions>中的捕获组。{R:0}是整个匹配的字符串,{R:1}是第一个捕获组,以此类推。
示例:
<conditions>
<!-- 只有当主机名是 example.com 时才执行规则 -->
<add input="{HTTP_HOST}" pattern="^example\.com$" />
<!-- 并且请求的文件不存在 -->
<add input="{REQUEST_FILENAME}" pattern="\.php$" negate="true" />
</conditions>
<action> 元素:执行操作
当规则匹配成功后,执行这里定义的操作。
主要属性:
| 属性名 | 描述 | 示例 |
|---|---|---|
type |
必填,指定操作的类型,最常用的两种是: - Rewrite: URL 重写,客户端浏览器地址栏的 URL 不会改变,服务器内部将请求重写到另一个资源,对客户端是透明的。- Redirect: URL 重定向,服务器返回一个 30x 状态码(如 301, 302)给客户端,客户端的浏览器地址栏会更新为新的 URL,并向新 URL 发起新请求。- CustomResponse: 返回自定义的 HTTP 响应。 |
<action type="Rewrite" /> |
url |
必填 (当 type 为 Rewrite 或 Redirect 时),目标 URL,可以包含对捕获组的引用({R:1})。 |
<action type="Rewrite" url="productdetails.aspx?id={R:1}" /> |
appendQueryString="true|false" |
指定是否将原始请求的查询字符串附加到新的 url 后面,默认为 true。 |
<action type="Rewrite" url="search.aspx" appendQueryString="false" /> |
redirectType="Permanent|Found|SeeOther|Temporary" |
当 type="Redirect" 时,指定重定向类型,对应不同的 HTTP 状态码:- Permanent: 301 (永久重定向)- Found / Temporary: 302 (临时重定向,默认)- SeeOther: 303 (参见其他) |
<action type="Redirect" redirectType="Permanent" url="https://www.newdomain.com{R:0}" /> |
综合示例
场景: 将 http://www.example.com/product/123 的请求,在服务器内部重写为 http://www.example.com/product_details.aspx?id=123,但用户浏览器地址栏仍然显示 http://www.example.com/product/123。
web.config 中的规则:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite Product ID" stopProcessing="true">
<!--
匹配 /product/ 后面跟着一个或多个数字,并以结尾
捕获组 (\d+) 会保存数字部分,123
-->
<match url="^product/(\d+)$" ignoreCase="true" />
<!--
可选:增加一个条件,确保请求的物理文件 /product/123 不存在,
避免重写一个已经存在的文件或目录。
-->
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<!--
执行重写操作。
type="Rewrite" 表示服务器内部重写。
url="product_details.aspx?id={R:1}" 表示重写到 product_details.aspx,
并将第一个捕获组 (\d+) 的值作为 id 参数传递。
-->
<action type="Rewrite" url="product_details.aspx?id={R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
如何管理这些规则?
- 手动编辑
web.config: 直接在 IIS 站点根目录下编辑web.config文件,适合高级用户。 - IIS 管理器 (GUI):
- 打开 IIS 管理器。
- 选择你的网站。
- 双击 “URL 重写” 功能。
- 在右侧操作栏,你可以 “添加规则”,并选择 “空白规则”、“入站规则”、“出站规则” 等。
- 图形界面会引导你填写
<match>,<conditions>,<action>等参数,并自动生成web.config配置,这是最推荐的新手方式。
希望这份详细的参数解析能帮助你更好地理解和使用 IIS URL Rewrite 模块!
