导入 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://mysite_com/iisstart.htmhttp://www_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 和其他格式)将会无法识别,也不会被错误地转换。