今天又被微软不按标准的做法折腾了一下,写篇博文抱怨一下。
我们先来看一下IETF(Internet Engineering Task Force)对URI结构的标准定义(链接):
注意上面的path部分(/over/there)是包含开头的斜杠的。
而微软的眼中偏偏少了开头的这个斜杠——over/there。
当你用微软的IIS Url Rewrite module写匹配规则时,必须要把开头的这个斜杠排除在外。
当你在ASP.NET MVC中用routes.MapRoute写路由规则时,必须要把开头的这个斜杠排除在外。
当你面对这样的URI(http://www.cnblogs.com/)时,匹配规则要写为^$。
如果抛开标准不谈,仅仅从使用直觉上,“/over/there”也比“over/there”更合理,因为通过开头的“/”可以直觉地知道是从根路径开始的,“over/there”给人的直觉就是一个相对路径。
如果你是一位长期使用微软平台的程序员,由于习惯原因可能体会不深;但如果你是从非微软平台转过来的程序员,会很不习惯。
而我今天被折腾,不是因为从非微软平台到微软平台,而只是从Helicon Tech的ISAPI_Rewrite到Microsoft的IIS Url Rewrite module。
今天在将一个站点从IIS 7.5(Windows Server 2008 R2)迁移至IIS 8.0(Windows Server 2012)后(顺带吐槽一下IIS 8.0竟然与IIS 7.5的配置文件不兼容),发现ISAPI_Rewrite在某些重写规则下会引发IIS应用程序池崩溃(503错误),只能改用IIS Url Rewrite module。
IIS Url Rewrite module支持从ISAPI_Rewrite的httpd.ini配置文件中导入Url重写规则,但就是因为微软眼中的URI Path与众不同,不得不对每条规则进行修改。之前,博客站点就被这个问题折腾过,今天再次被折腾,心里很不舒服,所以写博客一吐为快!
作为一名长期使用微软平台的程序员,即使没遇到这个URL重写问题,我也对URI Path中少一个斜杠很不习惯!
【补充】
在微软的Url Rewrite module的帮助文档URL Rewrite Module Configuration Reference中,可以找到微软心目中的URI标准是这样的:
For an HTTP URL in this form: http(s)://<host>:<port>/<path>?<querystring>