前几天看到一篇文章,说URL中加入www是一件很蛋疼的事。我刚开始搭建自己博客的时候(2006年)就已经接受了这个理念,这篇文章则让我在设置CSSPod的域名时更坚定的把WWW扔掉,并尝试将其301定向到根域名上。

众所周知,Apache的mod_rewrite规则能实现URL重写及301重定向等功能,像Direct Admin、cPanel一类的虚拟主机管理后台中都提供301重定向的可视化操作,互联网上关于mod_rewrite规则写法的资料也相对较多。然而,CSSPod现在部署在Windows Server 2008 R2的IIS 7.5中,跟mod_rewrite一毛钱关系都没有,当然可以通过在WordPress主题或WPheader等文件夹中加入相关代码,通过PHP实现301重定向。可我总觉得重定向一类的功能还是交给Web服务器处理比较好,还是尝试从IIS的URL Rewrite模块入手吧。

IIS的URL Rewrite模块的功能和Apache mod_rewrite差不多,但重写规则的语法结构差别很大,Apache的重写规则并不能直接拿来用在IIS中,网上也没有找到URL Rewrite重定向规则的实例,还好,IIS的URL Rewrite模块带有导入Apache mod_rewrite规则的功能,这样通过URL Rewrite模块实现301重定向也就剩点点鼠标的事了。

前期准备

  • 将csspod.com解析到服务器IP,将www.csspod.com添加一个CNAME到csspod.com(Godaddy的管理面板中默认添加);
  • 在IIS中设置网站,将csspod和www.csspod.com绑定到网站,相关操作都是基于GUI的,不在赘述。

转换mod_rewrite规则

重定向www.csspod.com到csspod.com的mod_rewrite规则为

[xml]
RewriteEngine On
RewriteCond %{HTTP_HOST} !^csspod.com$ [NC]
RewriteRule ^(.*)$ http://csspod.com/$1 [L,R=301]
[/xml]

[caption id="attachment_28" align="aligncenter" width="480"]IIS中的URL Rewrite模块 IIS中的URL Rewrite模块[/caption]

在IIS管理器功能视图中找到URL Rewrite模块点击打开,在右侧操作列表中点击Import Rules,复制mod_rewrite规则粘贴到Rewrite rules文本框中。

[caption id="attachment_26" align="aligncenter" width="480"]Convert mod_rewrite Rules 复制Mod-rewrite规则到转换框中[/caption]

Converted rules框的Tree View(树形视图)标签中会立即显示转换的结果,也可以点击XML View(XML视图)标签查看重写规则如何存储在Web.config文件中(Web.config是标准的XML格式)。

[caption id="attachment_25" align="aligncenter" width="480"]转换好的URL重写规则 web.config文件中URL重写规则[/caption]

切换回树形视图,选择一个节点,选中的mod_rewrite规则的转换结果将在Rewrite rules文本框中高亮显示。

[caption id="attachment_27" align="aligncenter" width="480"]转换结果高亮显示选中的规则 转换结果高亮显示选中的规则[/caption]

注意转换出来的规则是自动分配默认名称的,格式如Imported Rule 1,要更改默认名称,只需在树形视图中选择一条规则,右击然后在右键菜单中选择重名名即可。

[caption id="attachment_31" align="aligncenter" width="480"]重命名URL Rewrite规则 重命名URL Rewrite规则[/caption]

在操作面板中点击应用保存转换结果到Web.config文件中,点击Back to rules显示所有的重写规则。

[caption id="attachment_24" align="aligncenter" width="480"]保存应用重写规则 保存应用重写规则[/caption]

测试转换结果

在浏览器地址栏中输入www.ccsspod.com,回车,已经被重定向到csspod.com;再输入http://www.csspod.com/archives/hello-world ,同样重定向到http://csspod.com/archives/hello-world。转换后的URL Rerite规则如下:

  
    
      
      
        
      
      
    
  

声明

URL Rewrite模块尝试将Apache mod_rewrite转换为实现相同功能的IIS URL重写规则,但是,由于Apache和IIS的语法结构差异,并非所有mod_rewrite规则都能转换。建议用户在开始转换之前学习理解mod_rewrite规则,转换完成后,检查、测试转换结果,确保转换出来的IIS重写规则提供相同的重写逻辑。

注意,只有遵循Apache mod_rewrite语法的规则能被转换,其它格式的重写规则(如ISAPI_Rewrite、Ionic ISAPI Rewrite、IISRewrite及其它)没有经过验证,也许可以正确地被转换,也许不能。