默认的ASP。. NET MVC 3项目模板包含以下IgnoreRoute
指令:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
我现在已经看到多个项目改变这一行(包括StackExchange的DataExplorer),而不是看起来像:
routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*.axd(/.*)?"});
谁能解释在什么情况下或一般情况下,为什么默认的.axd
路由忽略是不够的,而后一个版本将是?或者反过来说,为什么人们会选择不使用后一个版本,而只是坚持使用默认版本呢?
我必须承认我不完全理解IgnoreRoute
的语法,关于这个主题的MSDN文档非常简洁。
在Phil Haack的博客中有一个解释:让路由忽略对文件扩展名的请求
引用菲尔的话,基本思想是:
一个解决方案是添加一个适当的忽略路由来指示路由应该忽略这些请求。不幸的是,我们不能这样做:
{*path}.aspx/{*pathinfo}
我们只允许一个通用路由,它必须发生在URL的末尾。但是,您可以采用以下方法....
我在这里做的是Eilon向我展示的一种技术,即将所有url映射到这些路由,然后通过约束字典限制要忽略哪些路由。因此,在这种情况下,这些路由将匹配(并因此忽略)对favicon.ico的所有请求(无论哪个目录)以及对.aspx文件的请求。因为我们告诉路由忽略这些请求,所以正常的ASP。. NET将处理这些请求。
原帖子中两次IgnoreRoute
调用的区别如下:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
这将匹配对资源的请求,如/ScriptManager。axd或/Foo.axd/bar/baz。但是将不匹配任何*的请求。axd资源在您的网站的根目录下,如/foo/bar/Baz.axd。
routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*.axd(/.*)?"});
这个调用使用正则表达式将请求匹配到任何*。axd资源,在您的网站的任何级别,如/foo/bar/Baz.axd。因此,如果您引用站点根目录下的任何附加资源,则此调用比第一个调用更可取。
如果分解正则表达式,开头的.*
将匹配0个或多个字符。.axd
将匹配字面值字符串".axd"
,而(/.*)?
将有选择地匹配后面跟着0或更多字符的斜杠。
{*allaxd}
URL模式中的*
确保将扫描整个路径,而不仅仅是路径的一部分。allaxd
只是一个给定给路径匹配部分的任意标签,在本例中是整个路径。这种忽略路由的方法有效地允许您忽略特定文件扩展名的路由。你可以很容易地复制这个调用,并做一些修改来忽略*的路由。aspx, *。Asmx等,等等
有关路由的详细文档,我强烈推荐以下MSDN页面