为什么要URL重写?
1、有利于SEO,带参数的URL由于内容可能是动态改变的,因此带参数的URL权重较低;
2、地址看起来更正规。
URL重写思路:每个浏览器端的URL请求都会首先触发Application_BeginRequest ,因此,我们可以在这个函数中取得用户浏览器传过来的URL,然后在这个函数中进行URL重写。
前台访问页面写法:
<a href='ViewArticle-<%#Eval("Id") %>.aspx'><%#Eval("Title") %></a>
从上句代码中可以得到浏览器中的URL形式为:http://localhost:4171/Art/ViewArticle-2.aspx
URL重写步骤:
第一步:通过HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath 获得用户要访问资源的虚拟路径
第二步:用HttpContext.Current.RewritePath(ReWriteUrl)进行重写,也就是把用户的URL请求(/Art/ViewArticle-2.aspx)交给另外一个页面(/View.aspx?id=2)处理。换句话说,就是把用户传过来的虚假的URL,转交给服务器中存在的真实的页面进行处理。
代码如下:
protected void Application_BeginRequest(object sender, EventArgs e)
{
//获得用户要访问的资源。这个属性获得的是虚拟路径
string url = HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath;
//判断用户访问的是否是/Art/ViewArticle-333.aspx格式
Match match = Regex.Match(url, @"~/Art/ViewArticle-(\d+)\.aspx");
if (match.Success)
{
//从正则表达式中获取文章的id
string id = match.Groups[1].Value;
//把客户端URL请求发给内部的其他页面
HttpContext.Current.RewritePath("~/Art/ViewArticle.aspx?id="+id);
}
}
知识点:
Rewrite和Redirect的区别:
通过Rewrite,可以把页面请求发给其他页面处理。但是和Redirect的区别在于,地址栏没有变化。
Redirect浏览器和服务器发生两次请求,也就是服务器命令客户端“去访问Test1.aspx”;Rewrite则是服务器内部的一个接管,在服务器内部告诉“Test1.aspx”“请帮我处理这个用户的请求”,浏览器和服务器只发生一次交互,浏览器不知道是Test1.aspx做的相应,浏览器只是向服务器发出一个请求。
就像用户去北京国美买手机,缺货时的两种处理:让用户自己坐车去上海国美买手机(Redirect);北京国美从上海国美内部调货,用户只需要在北京国美店里等着就行了,最后用户还是能在北京店里购买到手机(Rewrite)。
Server.Transfer和Redirect的区别同上。