ASP.NET 2.0 中处理目录访问的简单方法
对 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>