作者: 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 的主机名的请求时,可以将请求重定向到规范主机名。
启动 IIS 管理器,然后单击 “默认网站”。
在“操作”窗格中,单击“绑定”,并为端口 8088 添加新的 http 绑定。
图 1:添加新绑定使用记事本打开
%SystemDrive%\windows\system32\drivers\etc\hosts并在文件末尾添加以下两行:127.0.0.1 www_mysite_com 127.0.0.1 mysite_com请注意,对域分隔符使用“_”而不是“.”。 这是为了防止 Web 浏览器尝试使用域名系统(DNS)服务器解析域名。
保存 hosts 文件。
通过打开 Web 浏览器并访问站点
http://www_mysite_com/iisstart.htm和http://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 重写的格式,请执行以下操作:
启动 IIS 管理器。
在左侧的“ 连接 ”窗格中,选择 “默认网站”。
在右侧 的功能视图中,单击“ URL 重写”。
图 2:单击“URL 重写”
在右侧的 “操作 ”窗格中,单击“ 导入规则”。
复制上面的示例mod_rewrite规则,并将其粘贴到 “重写规则 ”文本框中。
图 3:要导入的规则
“已转换的规则”框的“树视图”选项卡会立即显示转换的结果。 还可以单击 “XML 视图 ”选项卡,查看规则如何存储在 Web.config 文件中。
图 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.htmhttp://mysite_com/iisstart.htm
在这两种情况下,Web 浏览器将重定向到 http://www_mysite_com/iisstart.htm。
此外,如果尝试以下任一 URL:
http://localhost:8088/iisstart.htmhttp://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 和其他格式),也不会被错误地转换。