通过


导入 Apache mod_rewrite 规则

作者: Ruslan Yakushev

介绍

IIS 7 及更高版本中的 URL 重写模块提供了一项导入功能,大大简化了将 Apache mod_rewrite 规则转换为 IIS URL 重写规则的过程。 在本演练中,你将使用 URL 重写模块中提供的导入规则功能将多个mod_rewrite规则导入 IIS 配置文件。 如果尚未下载 URL 重写模块,可以在以下位置 https://www.iis.net/downloads/microsoft/url-rewrite执行此操作。

设置逐步指导情境

要了解如何转换 mod_rewrite 规则并验证转换后的规则是否正常运行,你将实施一种常见方案,即强制网站使用规范的主机名。 在此示例中,你将强制使用 www.mysite.com 而不是 mysite.com,以便在发出使用不同于 www.mysite.com 的主机名的请求时,可以将请求重定向到规范主机名。

  1. 启动 IIS 管理器,然后单击 “默认网站”。

  2. “操作”窗格中,单击“绑定”,并为端口 8088 添加新的 http 绑定

    单击“操作”窗格中“编辑网站”下的“绑定”后“网站绑定”对话框的屏幕截图。 图 1:添加新绑定

  3. 使用记事本打开 %SystemDrive%\windows\system32\drivers\etc\hosts 并在文件末尾添加以下两行:

    127.0.0.1 www_mysite_com
    127.0.0.1 mysite_com
    

    请注意,对域分隔符使用“_”而不是“.”。 这是为了防止 Web 浏览器尝试使用域名系统(DNS)服务器解析域名。

  4. 保存 hosts 文件。

  5. 通过打开 Web 浏览器并访问站点http://www_mysite_com/iisstart.htmhttp://mysite_com/iisstart.htm,验证主机名是否已正确设置。

转换 mod_rewrite 规则

用于强制实施规范主机名的 Apache mod_rewrite规则包括:

#For sites running on a port other than 80:
RewriteCond %{HTTP_HOST}   !^www_mysite_com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/(.*)         http://www_mysite_com:%{SERVER_PORT}/$1 [L,R]

#And for a site running on port 80
RewriteCond %{HTTP_HOST}   !^www_mysite_com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/(.*)         http://www_mysite_com/$1 [L,R]

若要将这些规则转换为特定于 IIS URL 重写的格式,请执行以下操作:

  1. 启动 IIS 管理器

  2. 在左侧的“ 连接 ”窗格中,选择 “默认网站”。

  3. 在右侧 的功能视图中,单击“ URL 重写”。

    “默认网站主页”窗格的屏幕截图,其中选择了“U R L 重写”。

    图 2:单击“URL 重写”

  4. 在右侧的 “操作 ”窗格中,单击“ 导入规则”。

  5. 复制上面的示例mod_rewrite规则,并将其粘贴到 “重写规则 ”文本框中。

    “导入模式”下划线重写规则窗格的屏幕截图,其中包含一组重写规则和一组已成功转换的规则。

    图 3:要导入的规则

  6. 已转换的规则”框的“树视图”选项卡会立即显示转换的结果。 还可以单击 “XML 视图 ”选项卡,查看规则如何存储在 Web.config 文件中。

    在“转换的规则”部分的“树视图”和“X M L 视图”之间切换的屏幕截图。

    图 4:已转换的规则

    如果切换回 树视图 并选择一个节点,则会突出显示 “重写规则 ”文本框中相应的mod_rewrite规则指令。

    转换规则的树视图中所选节点的屏幕截图。

    图 5:树视图

    请注意,在规则转换期间,规则被分配为默认名称。 若要将默认名称更改为更有意义的内容,请在 树视图中选择一个规则,右键单击它,然后从上下文菜单中选择“ 重命名 ”。

    右键单击已转换规则以重命名规则的屏幕截图。

    图 6:重命名

    将第一个规则的名称从 ImportedRule1 更改为 重定向到 www_mysite_com:non-80。 将第二个规则的名称从 ImportedRule2 更改为 重定向到 www_mysite_com:80

    在“ 操作 ”窗格中,单击“ 应用 ”将转换的规则保存到 Web.config 文件,然后单击“ 返回规则”。

    “操作”窗格的屏幕截图,其中强调“应用”、“取消”和“返回规则”。

    图 7:返回规则

测试转换的规则

若要测试从mod_rewrite格式导入的规则正常工作,请打开 Web 浏览器,并转到以下任一 URL:

  • http://localhost/iisstart.htm
  • http://mysite_com/iisstart.htm

在这两种情况下,Web 浏览器将重定向到 http://www_mysite_com/iisstart.htm

此外,如果尝试以下任一 URL:

  • http://localhost:8088/iisstart.htm
  • http://mysite_com:8088/iisstart.htm

Web 浏览器将重定向到 http://www_mysite_com:8088/iisstart.htm

请注意,从 mod_rewrite 导入的规则已启用对网站域名规范主机名的强制执行。 必应搜索将显示 Apache mod_rewrite规则的其他示例。

免责声明

重要说明 - URL 重写模块尝试将 Apache mod_rewrite 规则转换为功能等效的 IIS URL 重写规则。 但是,由于 Apache 和 IIS 之间的体系结构差异,并非所有mod_rewrite规则都可以转换。 强烈建议先研究mod_rewrite规则集,直到在开始转换过程之前了解其功能。 然后,在转换为 IIS URL 重写规则后,查看并测试转换结果,以确保相应的 IIS 重写规则集提供相同的 URL 重写逻辑。

请注意,只能转换遵循 Apache mod_rewrite 语法的规则。 无法识别任何其他格式的重写规则(例如,ISAPI_Rewrite、Ionic ISAPI 重写、IISRewrite 和其他格式),也不会被错误地转换。