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重写遇到的问题。