遇到了urlrewriter的:"无法使用前导.. 在顶级目录上退出"问题

    • Intelligencia.UrlRewriter 2.0 RC1 beta 6
    • .net framework 2.0
    • visual studio 2008
    • iis6
  • 正好要做地址重定向的项目,在http://urlrewriter.net/上下载了最新的代码和类库。

    好像有些时候没有更新了,加之asp.net mvc的出现,这个功能要被整合到.net框架之中了,但由于还没有升迁到.net3.5,所以还是要借助这个东西来让URL更容易understand,更clean一些。

    本来是引用源代码在项目之中的,但是配置了web.config运行以后,虽然实现了页面重定向,但是地址栏里的地址显示出来的是定向目标的地址而不是重定向前的地址:(

    后来直接引用编译后的类库:把Intelligencia.UrlRewriter.dll复制到网站bin目录下并引用,修改web.config后实现重定向功能。

    这个新版本有另外的新功能:就是可以在url中写入条件语句来重定向(这可是写在web.config里面的,汗):

    <rewriter>
        <if url="/tags/(.+)" rewrite="/tagcloud.aspx?tag=$1" />
        <!-- same thing as <rewrite url="/tags/(.+)" to="/tagcloud.aspx?tag=$1" /> -->
    </rewriter>

    还有类似unless的条件语句:

    <unless header="HTTP_HOST" match="my.domain.com">
    <rewrite url="^/tags/big/(.+)$" to="/big-tag-cloud.aspx?tag=$1" processing="stop" />
    <rewrite url="^/tags/small/(.+)$" to="/tiny-tag-cloud.aspx?tag=$1" processing="stop" />
    <rewrite url="^/tags/medium/(.+)$" to="/normal-tag-cloud.aspx?tag=$1" processing="stop" />
    </unless>

    现在,问题来了,我的目录中含有~/news/shownews.aspx的文件,我做如下配置:

    <rewrite url="~/news/20080324/test.aspx" to="~/news/shownews.aspx" />

    出现:

    “/”应用程序中的服务器错误。

    无法使用前导 .. 在顶级目录上退出。

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
    异常详细信息: System.Web.HttpException: 无法使用前导 .. 在顶级目录上退出。

    然后想用相对路径来回避顶级目录的问题:

    <rewrite url="~/news/20080324/test.aspx" to="http://www.cnblogs.com/news/shownews.aspx" />

    问题依旧,但是无数次的尝试有如下发现,当改成这个地址时:

    <rewrite url="~/news/20080324/test.aspx" to="../news/shownews.aspx" />

    出现:

    “/”应用程序中的服务器错误。

    无法找到资源。

    说明: HTTP 404。您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。
    请求的 URL: /news/news/shownews.aspx

    当然我没有~/news/news/shownews.aspx这个文件,所以也找不到,但是至少可以不出现500错误,于是尝试:

    <rewrite url="^/news/test/test.aspx" to="http://www.cnblogs.com/shownews.aspx" />

    这下返回:

    “/”应用程序中的服务器错误。

    无法找到资源。

    说明: HTTP 404。您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。
    请求的 URL: /shownews.aspx

    我不希望我的项目根目录下有这么多的文件,所以还是又找来其它的文章来分析。

    经过分析发现是重名目录的问题(虽然不知道这算是什么问题)上面有一个出错的写法:

    <rewrite url="~/news/20080324/test.aspx" to="~/news/shownews.aspx" />

    如果这样写,就可以正确重定向:

    <rewrite url="~/news/20080324/test.aspx" to="~/test/shownews.aspx" />

    或是改掉重写前的地址:

    <rewrite url="~/test/20080324/test.aspx" to="~/news/shownews.aspx" />

        又不行了,看来urlrewriter可以正确运行,但是页面中有一些不能解析的东西,按照网上找来的方法,

  • 去掉页面中所有../的连接;

  • 把母版页转移动根目录下;

  • 把控件转到根目录下;

  • 。。。尽量避免一切会产生../的组件出现

 注意:<asp:HyperLink ID="HyperLink_4xAI" runat="server" ImageUrl="/images/logo.gif" NavigateUrl="~/Default.aspx" meta:resourcekey="HyperLink_4xAIResource1">4xAI</asp:HyperLink>
这个控件,当它位于用户控件中时,ImageUrl的属性是如果出现~,还是会报上面的错误,只能用绝对地址,至少我的测试结果是这样:(

下面提供的文章不一并对您有用,不过如果你可能是通过其他的搜索关键字来看到这篇文章,可能会对您有所帮助:

在 ASP.NET 中执行 URL 重写

无法使用前导 .. 在顶级目录上退出(Cannot use a leading .. to exit above the top directory)

对ASP.Net中URL重写的疑问

无法使用前导.. 在顶级目录上退出

Tip/Trick: Url Rewriting with ASP.NET 

技巧/诀窍:在ASP.NET中重写URL

posted @ 2008-03-24 16:07  风海迷沙  阅读(4527)  评论(3编辑  收藏  举报