导入 Apache mod_rewrite 规则
介绍
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://mysite_com/iisstart.htm
和http://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 重写的格式,请执行以下操作:
启动 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.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 和其他格式)将会无法识别,也不会被错误地转换。