iis rewrite 参数

99ANYc3cd6
预计阅读时长 24 分钟
位置: 首页 参数 正文

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

iis rewrite 参数
(图片来源网络,侵删)

一个完整的规则通常包含以下核心部分:

  1. <match>: 定义要匹配的 URL 模式,这是规则的触发条件。
  2. <conditions>: (可选) 定义一组附加条件,只有当所有条件都满足时,规则才会执行。
  3. <action>: 定义当规则匹配成功后要执行的操作,例如重写 URL 或重定向到另一个 URL。

下面我们逐一解析这些核心元素及其参数。


<rule> 元素:规则本身

这是整个重写逻辑的容器。

主要属性:

iis rewrite 参数
(图片来源网络,侵删)
属性名 描述 示例
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=123id=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 必填 (当 typeRewriteRedirect 时),目标 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>

如何管理这些规则?

  1. 手动编辑 web.config: 直接在 IIS 站点根目录下编辑 web.config 文件,适合高级用户。
  2. IIS 管理器 (GUI):
    • 打开 IIS 管理器。
    • 选择你的网站。
    • 双击 “URL 重写” 功能。
    • 在右侧操作栏,你可以 “添加规则”,并选择 “空白规则”、“入站规则”、“出站规则” 等。
    • 图形界面会引导你填写 <match>, <conditions>, <action> 等参数,并自动生成 web.config 配置,这是最推荐的新手方式。

希望这份详细的参数解析能帮助你更好地理解和使用 IIS URL Rewrite 模块!

-- 展开阅读全文 --
头像
Xbox One S拆机后内部结构有何不同?
« 上一篇 今天
Alienware R17拆机内部有何升级空间?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]