可以非常确定的是项目里面绝对没有../这种路径。
而且报错的页面非常极品,报错的行指在一个对象输出上,代码类似这样:
<h2>@Module.name</h2>
在读一个对象的属性的时候,竟然会报出"无法使用前导 .. 在顶级目录上退出。 ",而且即使删了这条语句别的地方也会报。
查了各种资料,都说是../这种路径的问题,我检查了包括数据,都没有../这种。
环境:.net framework 4.5 / .net mvc 4 / iis8集成模式:
urlrewrite的内容是:
<rule name="foo" stopProcessing="true"> <match url="blog/([^./]+).html?" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="/blog/context/{R:1}" logRewrittenUrl="true" /> </rule>
并且,如果我正常访问/blog/context?id=xxxx的时候,是完全没有问题的。
后来我在web.config里,让所有的请求交给应用程序处理,并且删掉urlrewrite的规则,在routerConfig.cs里写上路由规则,就好了:
web.config:
<system.webServer> <modules runAllManagedModulesForAllRequests="true" /> </system.webServer>
urlrewrite,把转发规则注释掉:
<!-- <rule name="foo" stopProcessing="true"> <match url="^blog/([^./]+?)\.html" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="/blog/context/{R:1}" logRewrittenUrl="true" /> </rule> -->
程序里RouteConfig.cs是这样写的:
routes.MapRoute( name: "blogcontext", url: "blog/{id}.html",//参见 defaults: new { controller = "Blog", action = "Article", id = UrlParameter.Optional }, namespaces: new string[] { "Blog.Controllers" } );
简单来说是把请求拦截下来交给应用程序处理了,大概估到是urlRewrite重写后导致的问题。
但是对这个问题仍然不明白,并且不太满意这个方案。
题主可以先检查一下模版页中的代码。
可以非常非常非常确定模板页中代码没有问题
把blog/([^./]+).html?
改为^blog/([^./]+?)\.html
试试
改了之后还是会报同样的错
村长,看下我补充的内容
@linkFly: 视图中有没有“../”这样的路径?
@dudu: 可以非常确定绝对没有"../"这样的路径,我对整个项目搜索过了,出问题的cshtml也查过了。
@linkFly: 建议试试匹配路径与重写路径不使用同样的名称/blog/
。
另外,这个错误对应的英文错误信息是:
Cannot use a leading .. to exit above the top directory