经常在网上看到这样的地址http://XXX.XXX.com/20070726/251251116.htm,其实这些静态文件有可能根本不存在,而客户在浏览时,是不知道站点上根本不存在这个文件。这是怎么实现的呢?对,是URL重写,这样有什么好处呢。我个人认为有以下几个优点:
1. 易于理解。比如新闻栏目http://someblog.com/news/2007/01/28/XXX.htm,显示的是2007年1月28日的某条新闻。
2. 易于键入。
3. 可以看出站点的结构。
4. 可以有效的防SQL注入。http://someblog.com/news/display.aspx?year=2007&month=7&day=21&id=XXX,客户端可以清楚地看到querystring的值,若过滤不严,就出现明显的SQL注入。而把上面的地址在客户端显示为http://someblog.com/news/2007/01/28/XXX.htm,若在客户端修改这几个参数值,若没有相应的内容,就出现找不到这个页面,而不会暴露出数据库等相关信息。做了地址重写,再加上对他们过滤,安全系数比没有重写URL时要大大的提高。即使你不会过滤,我用注入工具scan了下代码,没有找到注入地址。
那重写URL在站点如何实现呢。有以下几点:
url rewriting的方法
原文地址http://weblogs.asp.net/scottgu/archive/
1. 使用Request.PathInfo代替QueryStrings(不用了)
原url: http://www.store.com/products.aspx?category=books
目标url: http://www.store.com/products.aspx/Books
方法:
Function GetCategory() As String
If (Request.PathInfo.Length = 0) Then
Return ""
Else
Return Request.PathInfo.Substring(1)
End If
End Function
2. 使用HttpModule
原url: http://www.store.com/products.aspx?category=books
目标url: http://www.store.com/products/Books.aspx
方法:
void Application_BeginRequest(object sender, EventArgs e) {
string fullOrigionalpath = Request.Url.ToString();
if (fullOrigionalpath.Contains("/Products/Books.aspx")) {
Context.RewritePath("/Products.aspx?Category=Books");
}
else if (fullOrigionalpath.Contains("/Products/DVDs.aspx")) {
Context.RewritePath("/Products.aspx?Category=DVDs");
}
}
3. 使用UrlRewriter.net(http://urlrewriter.net/)或UrlRewriting.net(http://www.urlrewriting.net/en/Default.aspx)
配置在web.config中
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="rewriter"
requirePermission="false"
type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
</configSections>
<system.web>
<httpModules>
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
</httpModules>
</system.web>
<rewriter>
<rewrite url="~/products/books.aspx" to="~/products.aspx?category=books" />
<rewrite url="~/products/CDs.aspx" to="~/products.aspx?category=CDs" />
<rewrite url="~/products/DVDs.aspx" to="~/products.aspx?category=DVDs" />
<rewrite url="~/products/(.+).aspx" to="~/products.aspx?category=$1" /><!--使用正则表达式-->
</rewriter>
</configuration>
4. 无后缀页面
IIS7中: 在web.config中配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<configSections>
<section name="rewriter"
requirePermission="false"
type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
</configSections>
<system.web>
<httpModules>
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />
</httpModules>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
<rewriter>
<rewrite url="~/products/(.+)" to="~/products.aspx?category=$1" />
</rewriter>
</configuration>
IIS5 and IIS6中使用ISAPI Filter: Helicon Tech's ISAPI Rewrite(http://www.isapirewrite.com/), Ionic's ISAPI Rewrite(http://cheeso.members.winisp.net/IIRF.aspx)
5. 处理form postback链接
增加.browser文件
详细见http://weblogs.asp.net/scottgu/archive/
具体的实例代码,我会在下篇中给出,请大家关注。谢谢!
引自: www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
http://blog.chinaunix.net/u/4606/showart_250841.html