65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 2.0 中处理目录访问的简单方法

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (4投票s)

2006年1月12日

CPOL

1分钟阅读

viewsIcon

39990

对 ASP.NET 2.0 中 URL 重写的补丁:处理目录访问。

引言

Richard Birkby 写了一篇关于 使用 ASP.NET 进行 URL 重写 的完美文章。本文只是对其如何处理目录访问的一个补丁。

问题

使用 Richard 的框架(真的很棒!),我们可以隐藏 "https://apache.ac.cn/BookDetails.pl?id=5" 并使用格式良好的 URL,例如:"https://apache.ac.cn/Book/5.html"。但它无法处理如下 URL:

  • https://apache.ac.cn/Book/Java/
  • https://apache.ac.cn/Book/C#/

因为,ASP.NET 会尝试解析此目录并查找其中的 "default.aspx"。当然,它会返回 404 Not Found 错误。

简单的方法:步骤 1

首先,我们应该按如下方式更新 web.config 文件

<httpHandlers>
    <add verb="*" path="Default.aspx" type="URLRewriteHandler"/>
    <add verb="*" path="*/" type="URLRewriteHandler"/>
</httpHandlers>

我们添加一个处理程序,将其映射到 Default.aspx;当访问虚拟路径的 "/" 时,它将起作用。 另一个处理程序映射到 "*/";当访问目录时,例如 "/some/path/",它将起作用。 现在,URLRewriteHandler 可以处理以 "/" 结尾的目录访问。

简单的方法:步骤 2

想知道如果有人输入 "https://apache.ac.cn/Book/Java" 会发生什么? 我们仍然会收到 404 Not Found 错误。 这意味着我们应该处理**没有扩展名**的 URL,但我们无法直接在 web.config 中编写此映射,因为 ASP.NET 不会识别它。

我们应该如何看待 "https://apache.ac.cn/Book/Java"? 这是一个错误的 URL 吗? 是的! 我们需要做的就是使用正确的 URL(在行尾带有 "/")来纠正这个错误。 想法是编写一个 HTTP 模块来处理错误的 URL 并强制客户端重定向到正确的路径。

public class URLCheckingModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(Context_OnBeginRequest);
    }

    private void Context_OnBeginRequest(object sender, EventArgs e)
    {
        // check Request 
        HttpContext context = HttpContext.Current;
        HttpRequest request = context.Request;
        string file = request.FilePath;
        string ext = Path.GetExtension(file);
        if (string.IsNullOrEmpty (ext) && ! file.EndsWith ("/"))
        {
            string q = request.QueryString.ToString ();
            string path = request.FilePath + "/" + 
                          (string.IsNullOrEmpty(q) ? "" : q) ;
            context.Response.Redirect(path);
        }
    }

    public void Dispose()
    {
        
    }
}

然后在 Web.config 中注册它

<httpModules>
    <add name="URLChecking" type="URLCheckingModule"/>
</httpModules>
© . All rights reserved.