uri(统一资源标识符) url(统一资源定位符) urn(统一资源名)
uri在世界范围内唯一标识并定位信息资源,uri包括url和urn两种形式(大部分uri都是url)。
url描述了某台服务器上某资源的特定位置。url实例 http://www.test.com/test.jpg。url有三个部分组成,第一部分称为方案(scheme),说明了访问资源所使用的协类型;第二部分给出了服务器的因特网地址(如www.test.com);第三部分指定了服务器上的某个资源(如test.jpg)。
urn是作为特定内容的唯一名称使用的,与目前的资源所在地无关,通过urn可以用同一个名字通过多种网络访问协议来访问资源。
url的语法。
符号@只是一个分隔符。
url片段。url片段表示网页中的一个位置,以#开头然后是标识符,如#test,可以用<a name="test"></a>或<div id="test"></div>标志一个位置,当点击一个具有特定片段的连接时,浏览器会自动使具有相应标记的内容显示在当前可见区域。浏览器不会将片段传至服务器。可参考http://www.cnblogs.com/BeyondTechnology/archive/2011/03/27/1997172.html。
相对url。相对url要有一个基础url作为参考点,可以是封装资源的基础url(即浏览器地址栏中的url)也可以用base标签在资源中显示提供。
<html>
<head>
<base href="http://www.w3school.com.cn/i/" />
<base target="_blank" />
</head>
<body>
<img src="eg_smile.gif" />
</body>
</html>(来自w3school)
url编码。进行url编码有两个比较重要的原因,一是查询字符串中的value值包含url中的一些保留字如&、=;二是当传输一些US-ASCII字符集之外的字符时,如果服务器不支持此字符集的话就会出现乱码。
url编码的几种情况(参考(http://www.cnblogs.com/wgw8299/archive/2011/02/04/1949148.html))
1.网址路径中包含汉字
url编码与浏览器的设置有关。工具--》Internet选项--》高级选项卡勾选utf-8,打开http://zh.wikipedia.org/wiki/春节,通过fiddler工具可以看到GET /wiki/%E6%98%A5%E8%8A%82 HTTP/1.1(此为“春节”的utf-8的16进制编码),如果去掉utf-8选项则为GET /wiki/%B4%BA%BD%DA HTTP/1.1(此为“春节”的GB2312的16进制编码)(用IE8测试的)。
string data = "春节";
byte[] encData_byte = new byte[data.Length];
//encData_byte = Encoding.GetEncoding("GB2312").GetBytes(data);
encData_byte = Encoding.GetEncoding("utf-8").GetBytes(data);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < encData_byte.Length; i++)
{
sb.Append("%");
sb.Append(Convert.ToString(encData_byte[i], 16));
}
Response.Write(sb.ToString());
http事务,http报文
一个http事务由一条(从客户端发往服务器)请求命令和一个(从服务器发回客户端的)响应结果组成。web页面中可以包含多个对象,应用程序完成一项任务时通常会发布多个http事务。
http报文的组成
http报文分为请求报文和响应报文两类。请求报文的起始行指明了请求方法、资源路径、协议及版本,响应报文的起始行说明了协议及版本、状态码、原因短语。
请求报文起始行
响应报文起始行。
一些常用的请求方法
状态码分类
http首部的分类
几个首部的说明(参考 http://kb.cnblogs.com/page/130970/)。
首部 | 取值 | 说明 |
Cache-Control | NoCache | 缓存可以存在客户端,但是在与服务器进行再验证之前 不能直接使用 |
Cache-Control | Private(默认值) | 缓存在客户端 |
Cache-Control | Public | 可以缓存在任何地方 |
Cache-Control | Server | 缓存在服务器 |
测试 | ||
Page_Load事件添加代码 Label1.Text=DateTime.Now.ToString(); Response.Expires = 1; //缓存1分钟 Response.Cache.SetCacheability(HttpCacheability.Private); 在浏览器中查看该页,页面显示出当前时间,接着地址栏敲回车还是显示当前时间,一分钟以后再敲回车,时间就刷新了。 如果把Private改为NoCache,在地址栏敲回车时间立即就会刷新。(如果点刷新按钮,缓存没过期也会向服务器重新请求) 如果把Private改为Public或Server,再添加代码 Response.Cache.SetValidUntilExpires(true); 在过期之前点击刷新按钮时间也不会刷新了。 | ||
Cache-Control | max-age=1000 | 从第一次生成文档到文档不再新鲜经历的 时间(以秒为单位是个相对时间) |
Expires | Wed, 23 Oct 2013 03:27:12 GMT | 文档的绝对过期时间(依赖于计算机时钟 的正确设置) |
Etag | 1CECF9D16396B80 | 标记文件版本,与If-None-Match配合使用 |
If-None-Match | 1CECF9D16396B80 | 当浏览器收到一个Etag响应头时,用户刷新时 浏览器会向服务器发送一个具有该Etag 的If-None-Match头。 |
测试 | ||
在Global.aspx文件中加入代码 if (Request.CurrentExecutionFilePathExtension == ".js") { Response.Cache.SetMaxAge(TimeSpan.FromMinutes(1)); Response.Cache.SetValidUntilExpires(true); } 当过期之前点击刷新按钮,对js文件的请求,服务器会发送 304 Not MoModified |
说明:一些内容来自http权威指南。