今天又被微软不按标准的做法折腾了一下,写篇博文抱怨一下。

我们先来看一下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>

不走标准路的微软:少一个斜杠的URI Path的更多相关文章

  1. (转载)PHPCMS V9专题路径多了一个斜杠的解决办法

    PHPCMSV9的专题,在设置生成静态并且网站的静态设置成生成在根目录的时候,专题路径的URL中会多出一个斜杠,如:http://www.2cto.com//special/ddos/ ,我只能说这是 ...

  2. js文件中三斜杠注释///reference path的用途

    编辑某个js文件时,要想这个js文件出现其他js成员的ide提示,可以在js文件开头使用3个斜杠注释和reference指令的path指向此js文件路径,这样在编写这个js文件时,ide就会自动出现p ...

  3. Servlet处理带尾部斜杠/的URI

    有一个需求:让一个Servlet能够同时处理形如/XXX/YYY和/XXX/YYY/的URI,即URI尾部的斜杠有没有都要能处理到. 很容易想到,做两个URL Pattern/XXX/YYY和/XXX ...

  4. Eclipse进行Debug时断点上有一个斜杠,并且debug没有停在断点处

    断点上有斜杠,这是由于设置了Skip All Breakpoints的缘故,调试会忽略所有断点,执行完,只需取消Skip All Breakpoints即可,操作:Run-->Skip All ...

  5. 在eclipse程序中设置的断点上有一个斜杠,正常启动debug不能够跳转到debug页面,怎么解决

    在run菜单里面,把skip all breakpoints 选项勾去即可,这个选项可能是你无意间选上的.

  6. js 获取字符串中最后一个斜杠后面的内容

    var str = "/asdasf/asfaewf/agaegr/trer/rhh"; var index = str .lastIndexOf("\/"); ...

  7. 10. js截取最后一个斜杠后面的字符串

    var startIndex = filePath.lastIndexOf("\\"); endIndex = filePath.lastIndexOf("." ...

  8. js截取最后一个斜杠之后的内容

    var str = "/asdasf/asfaewf/agaegr/trer/rhh"; var index = str .lastIndexOf("\/"); ...

  9. 【解决了一个小问题】golang go.mod中多了一个斜杠导致replace无效

    replace github.com/sxxx/common_lib/src/ => ../../common_lib/src 修改成 replace github.com/sxxx/commo ...

随机推荐

  1. Android isUserAMonkey()

    Monkey是Android上的一个自动化测试工具.产生随机事件由于压力测试等. ActivityManager.isUserAMonkey()判断当前是否有运行的Monkey测试.有就返回true. ...

  2. 观察者模式/ java实现附代码 /

    /注:场景和例子引用github上的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/observer 场景: ...

  3. linux -- Ubuntu 命令技巧合集

    http://www.nenew.net/UbuntuSkills.html#.E6.9F.A5.E7.9C.8B.E8.BD.AF.E4.BB.B6xxx.E5.AE.89.E8.A3.85.E5. ...

  4. Unity3D之碰撞体,刚体

    一 概念介绍 刚体 Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动.任何游戏对象只有添加了刚体组件才能受到重力的影 ...

  5. django-south使用 [转]

    转自: http://alexliyu.blog.163.com/blog/static/16275449620126239949478/ 使用South之前铭记:请你一定要相信他的能力,抛弃对他的不 ...

  6. 存储过程不返回记录集导致ADO程序出错

    HRESULT _hr = get_adoEOF(&_result); IsEOF()函数如下:其中ADOCG::_RecordsetPtr m_pRecordset; BOOL IsEOF( ...

  7. 定义的函数在main中调用时提示找不到标识符

    要把定义的函数放在main函数前,如果放在main函数后了,要在main前做声明.声明就是把函数定义的首部一行加一个分号放在main之前. 在c语言中自定义了一个函数,在main中调用时提示找不到标识 ...

  8. 记录下Lambda常用的表现形式

    纯粹记录下Lambda的表现形式: (x, y) => x * y;//多参数,隐式类型=>表达式 x => x * ;//单参数,隐式类型=>表达式 x => { ; ...

  9. IOS -执行时 (消息传递 )

    一 函数调用概述      Objective-C不支持多重继承(同Java和Smalltalk),而C++语言支持多重继承. Objective-C是动态绑定,它的类库比C++要easy操作. Ob ...

  10. EF--CodeFirst

    1,增加EntityFramework的引用 2,创建实体类 public class Invoice { public Invoice() { LineItems = new List<Lin ...