1.优先需要区分静态URL和动态URL
静态URL是指不包含检索字符串的URL,静态URL的可读性好,也容易记忆。如:http://www.mysite.com/home
动态URL是指包含检索字符串的URL,这种URL在ASP.NET开发的Web项目中常见,检索字符串常用来给页面传递参数。
如:http://www.mysite.com/home/producttion.aspx?id=1
对于搜索引擎来说,静态URL比动态URL拥有更高的价值。在使用ASP.NET开发Web网站的时候,考虑到搜索引擎优化的因素,应该尽量避免使用动态URL。
2.URL重写
URL 重写是截取传入的Web请求并自动将请求重定向到其他资源的过程。
利用URL重写技术,将一个静态URL重定向到一个动态URL,可以避免让用户和搜索引擎看到动态URL。例如,当用户请求boolDetail/1时,把这个静态URL重写向
bookdetail.aspx?id=1的页面,后者则为真正的URL,可以通过检索字符串获得页面参数。
3.使用HTTP模块重写URL
在ASP.NET过程中,处理每一个HTTP请求时都会执行已经注册的HTTP模块,所以在HTTP模块中可以编写适用于所有请求的公用代码。
下面是简单的URL重写
public class MyUrlRewriter : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
string path = context.Request.Path.ToLower(); //得到请求路径
string bookDetailPage = "/bookdetail/";
if (path.StartsWith(bookDetailPage)) //重写Bookdetail.aspx页面URL
{
//静态url形式为/bookdetail/6,其中6为图书编号,重定向到带检索字符串的页面
string id = path.Substring(bookDetailPage.Length);
int n;
if (int.TryParse(id, out n))
context.RewritePath("~/BookDetail.aspx?id=" + id,false);
}
}
#endregion
}
再完成这些操作后,如果在Web网站中的某些图片使用了相对路径,发觉有些图片不能显示。原因在于
当URL重写后路径就发生了变化,例如图书的相对路径为bookImage/1b.jpg,在未进行URL重写时,这个图片的绝对路径是 /bookImage/1b.jpg,但是一旦URL
重写那么这张图片的绝对路径就发生了变化,为/BookDetail/bookImage/1b.jpg,通过路径可以看出,这个路径显然是找不到正确的图片,所以,一旦原来网页的
图片或者其他资源使用了相对路径,那么在URL重写后路径就发生了变化,解决这个问题的方法是把Web中所有相对路径改为绝对路径。设置正确的图书路径是/bookImage/1b.jpg
(注意图片路径是以/开头,表示绝对路径,如果没有/就表示相对路径)。具体区别可以参考:http://blog.csdn.net/jzdzhiyun/article/details/5282512。
4.处理回发的问题
URL重写之后,由于改变了页面的路径,会带来一系列的问题,如找不到图片,外部CSS文件,外部Javascript文件等,当然解决这个问题的最好方法就是把相对路径
改为绝对路径。然后这还会引发一个更为严重的问题,就是页面上的所以服务器控件事件(如按钮的click事件)都无法正常工作.解决这个问题的方法就是使页面提交仍然提交到经过重
写优化以后的URL。由于页面提交的地址是在页面生成的HTML文档中from元素的action属性中指定,要写修改提交地址,必须想办法修改页面所生成的HTML代码的action属性。
基本思想就是重写from元素属性,将其修改为经过优化以后的URL(即浏览器看到的URL)。
具体可以参考:http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx
在项目中添加UrlRewriterControlAdapter类和UrlRewriter类
public class UrlRewriterControlAdapter:ControlAdapter
{
protected override void Render(HtmlTextWriter writer)
{
//使用自定义的UrlRewriter类呈现控件(此处为HtmlForm)
base.Render(new UrlRewriter(writer));
}
}
public class UrlRewriter : HtmlTextWriter
{
//构造函数
public UrlRewriter(HtmlTextWriter writer)
: base(writer)
{
this.InnerWriter = writer.InnerWriter;
}
/// <summary>
/// 重写基类的WriteAttribute方法
/// </summary>
/// <param name="name">要写的Attribute的名称</param>
/// <param name="value">要写入的Attribute的值</param>
/// <param name="fEncode">是否对属性名称和值进行编码</param>
public override void WriteAttribute(string name, string value,bool fEncode)
{
//检查当前要写入的属性是否为action属性
if (name.ToLower() == "action")
{
var context = HttpContext.Current;
if (context.Items["ActionRewrite"] == null)
{
value = context.Request.RawUrl; //将其重写为浏览器请求的Url
context.Items["ActionRewrite"] = true; //设置标记,已经重写action属性
}
}
base.WriteAttribute(name, value,fEncode); //调用基类相应方法
}
}
完成这一步骤之后。
在解决方案中资源管理中,右击“添加”|“添加ASP.net文件夹”|“App_Browsers"命令。这就添加了一个App_Browsers文件夹
在App_Browsers文件中添加一个浏览器文件my.browser,并在其中注册刚刚创建的控件适配器UrlRewriterControlAdapter,代码如下
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
adapterType="BookShop.UrlRewriterControlAdapter" />
</controlAdapters>
</browser>
</browsers>
这就解决了URL重写遇到的问题。