Archive

Archive for the ‘网站开发’ Category

HTTP 1.1 Cache 和 Apache

August 4th, 2010 admin No comments
基础知识
         1) 什么是”Last-Modified”?

       在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记(Http Reponse Header)此文件在服务期端最后被修改的时间,格式类似这样:

        Last-Modified: Fri, 12 May 2006 18:53:33 GMT

         客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头(Http Request Header),询问该时间之后文件是否有被修改过:

        If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT

         如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。
:如果If-Modified-Since的时间比服务器当前时间(当前的请求时间request_time)还晚,Apache会认为是个非法请求

         2) 什么是”Etag”?

         HTTP 协议规格说明定义ETag为“被请求变量的实体值” (参见 —— 章节 14.19)。 另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:

        ETag: “50b1c1d4f775c61:df3″

         客户端的查询更新格式是这样的:

        If-None-Match: “50b1c1d4f775c61:df3″

         如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。本人测试Etag主要在断点下载时比较有用。
        
       Last-Modified和Etags如何帮助提高性能?
         聪明的开发者会把Last-Modified 和ETags请求的http报头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。
         过程如下:
                 1. 客户端请求一个页面(A)。
                 2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
                 3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
                 4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
                 5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

注:
1、Last-Modified和Etag头都是由Web Server发出的Http Reponse Header,Web Server应该同时支持这两种头。
2、Web Server发送完Last-Modified/Etag头给客户端后,客户端会缓存这些头;
3、客户端再次发起相同页面的请求时,将分别发送与Last-Modified/Etag对应的Http Request Header:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和Web Server发出的Last-Modified,Etag值完全一样;
4、通过上述值到服务器端检查,判断文件是否继续缓存;

关于Etag和Last-Modified网上还有更精辟的解释

1、关于Last-Modified

HTTP的Response中还会有另外一个Header叫Last-Modified,比如

Last-Modified: Thu, 06 Apr 2006 21:17:12 GMT”,

浏览器访问一个URI得到这样的Resposne之后,就知道这个资源最后一次的修改时间,下次需要再次获得这个资源的时候,会发一个Request给Server,不过这个Request中有一条

“If-Unmodified-Since: Thu, 06 Apr 2006 21:17:12 GMT”,

如果在Server端在这个日期之后对这个资源进行了修改,就会照常返回这个资源给Client端,但是如果没有修改,就会返回一个304 (Not Modified) Response而不返回资源,告诉Client端:“这个资源从上次给你之来从来没改过,你放心用你Cache中的好了。” 一个304 Response比一个静态资源通常小多了,这样就节省了网络带宽。

点击查看原始尺寸

2、Last-Modified和Expires的区别

让我们回过头来比较一下Expires和Last-Modified这两个东西,似乎Last-Modified比不上Expires,因为虽然它能够节省一点带宽,但是还是逃不掉发一个HTTP请求出去,而Expires却使得浏览器干脆连HTTP请求都不用发,岂不痛快!那还要Last- Modified这个物体干什么?理想状况的确是这样,不过当用户在IE或者Firefox里面按F5或者点击Refresh按钮的时候(不是在URL栏里重新输入一遍URL然后回车),就算对于有Expires的URI,一样也会发一个HTTP请求出去,所以,Last-Modified还是要用的,而且要和Expires一起用。

3、Etag

除了Last-Modified,HTTP Response中还可能有另外一个Header: ETag,使得Server上的静态资源有点“版本控制”的味道Smile 假如HTTP Response中包含

ETag: “abcdefg1234:0001″

等于告诉Client端,你拿到的这个版本的资源有个ID,叫做abcdefg1234:0001,下次需要发Request索要同一个URI的时候,在Request里面加一条

If-None-Match: “abcdefg1234:0001″

好,Server 端做了一些修改,下次这个Client再来了一个请求,但是这时候资源已经改了,所以返回这个新资源,还有新的tag “ETag: “abcdefg4567:0001″”(这个etag我是胡写的),这样,Client端等于Cache了两份,在需要索要这个资源的时候,可以包含这样的Header: “If-None-Match: “abcdefg1234:0001″ “abcdefg4567:0001″”,这样,即使Server端头脑发热,把这个资源Roll back回原来的版本,依然会返回304 (Not Modified) Response,因为它知道Client端Cache着以前的版本呢,这点功能是Last-Modifed/If-Not-Modified没法做到的。

4、Etag的弊端

不过ETag/If-None-Match这点功能实在是个鸡肋,首先,Server端的资源不大可能Roll Back,更重要的是,有可能造成Client Performance下降。对于只有一个Server的网站,没什么问题,但是现在稍微上点规模的网站都需要Scale Out,也就是说需要前端一个Load Balancer,后面接多台Server来处理请求,俗称Cluster,既然是Cluster,那么每个请求到底返回什么结果应该和分配到哪个 Server无关,不过这个ETag可能就坏事了。假如用户的第一次请求分配给Server A,返回“ETag: “abcdefg1234:0001″”,但是第二次请求分配给了Server B,Server B上这个资源和Server A上的一模一样,但是计算出这个资源的ETag是”abcdefg1234:0002″,这下麻烦了,虽然内容一样,但是ETag不匹配,还是浪费了带宽把资源发送了一遍,冤枉啊!而事实上,不同Server上的ETag很有可能不同,对于Apache,ETag的计算考虑了inode,对于 IIS,ETag考虑了metabase的修改版本,要保证不同server上的这些信息一致,有点小难。不过不是有Last-Modified/If- Not-Modified吗?Server端看到If-Modified-Since,对照一下时间对得上,不管If-None-Match,可以直接发回304(Not Modified)呀,很不幸,RFC2616对这种情况做了规定,如果既有If-None-Match又有If-Modified-Since,除非两者不冲突,不然不会返回304。

图像101

所以说ETag就是一个害人精,按照Yahoo的建议,别费劲想办法同步不同Server上的ETag了,干脆就把ETag删除得了(缺省,Apache和 IIS都是有ETag的),我Sniff了一下Yahoo的若干网页返回HTTP Response,的确没有ETag,人家的确是知行合一Smile

对于Apache,在httpd.conf或者.htaccess中加一行就搞定了:

5、Apache中的Etag设置
补充:
Apache默认开启Etag,可以使用FileEtag来设置

FileETag none|INode|MTime|Size|All

从apache的实现中http_etag.c我们可以发现,Apache的Etag包括了Inode|Mtime|Size这些因素。

对于IIS 6,可就有点费劲了,首先,似乎没有办法通过Config来把ETag去掉,查了很多资料,问了很多人,似乎能够去掉ETag的办法只有写一个ISAPI Filter来弄,Sniff了一下Microsoft的几个网页的结果显示ETag都稳当当的存在,估计目前真的没有什么好方法。

只好退而取其次,保证不同Server上的ETag一致了。 IIS对Etag的计算算法是ETag = {Filetimestamp:ChangeNumber}, Filetimestamp保持一致没什么问题,ChangeNumber是metabase的change number,就有点难保证Cluster中每个Server都一样了,所以,干脆就把它设成固定值好了,这个连接告诉我们该怎么办,很可惜,没有找到彻底删除ETags的配置。

转自:http://hi.baidu.com/injava/blog/item/3b8a3e34d4887a3c5bb5f5d8.html

Categories: PHP, 网站开发 Tags:

Ajax提交数据时,参数丢失问题

July 10th, 2010 admin No comments

在购物车的页面提交数据,时常有客户的订单出现空白现象,最后发现,原来在地址中包含#号等字符时,url后面的参数被全部忽略掉了。

怎么解决?
先表单的值用 escape 处理之后,问题解决。

Categories: PHP, 网站开发 Tags:

cn的域名只有公司才能注册??是新的事物?

December 15th, 2009 admin No comments

在昨天看到那则消息的时候,其实有点吃惊,后来看了该文章的评论,才醒了过来。为什么这么说呢?

我被写文章的人引导了,他的言辞把读者的思维引向了一个奇怪了逻辑,就是cn是突然只能是公司注册。

而实情是,在cn刚推出来的时候,就已经说的很清楚,个人是无法注册cn域名的,必段是正规企业才可以,只是,由于域名代理商的监督不严,或者由于利益方面的原因,一直没有得到执行。以至于,我们已经忘记了,原来,cn是个人无法注册的,而这个情况,一直都是个死火山。

在昨天,它爆发了。用它的个人站长们,是受影响最大的吧,之后在注册域名的时候,看来要更加小心哦。

但是借此为导火线,大部分的国内站长会转向去国外买域名,比如,我,首先考虑的是国外,因为国内的网络环境真的让人不敢恭维。

对于此事的思考再就是最初想到的,为什么会激起这么大的反响?各大网站都有报道,相信只要有QQ,都会看到这条信息?明明是本来就如此的事情,现在却变的不应该了,有两个原因:

  1. 一开始就有明文规定,但是代理商没有设置门槛,为什么?Money.以至已经给大众造成了错觉
  2. 网络媒体一边倒的宣传,很容易把网民误导了,包括我在内。看来,之后还是要做理性点的网民,自己的思想,自己把握,不要交给别人。
Categories: 网站开发 Tags:

2009年12月14日上午9时起个人将无法注册域名

December 14th, 2009 admin No comments

2009年12月14日上午9时起个人将无法注册域名,原文在这里:http://www.cnnic.net.cn/html/Dir/2009/12/11/5749.htm.

只能说,注册域名的门槛又高了,从备案到现在的域名注册,国内的网络环境变的越来越复杂。

要想下办法把域名转出去才行,http://www.williamlong.info/blog/archives/322.html

Categories: 网站开发 Tags:

网页出现脚本错误:源于google统计

December 4th, 2009 admin No comments

最近公司网站,会突然间出现脚本错误,在IE6,IE7下面,IE8没看,估计也难以幸免,在调试的本地的时候,也会出现同样的情况,去掉本地的google统计代码,才恢复正常。

打开一路随行博客,发现也是如此,打开同行的网站,因为他们也有google分析吧,发现同样如此。

得出结论是:google分析出现了代码错误,估计受影响的网站不在小数了。

ps:在发完这小段话后,发现google分析已经正常,嘿嘿,好强!

当机也有风度 世界著名网站当机页面一览

December 1st, 2009 admin No comments

中规中矩类

Gmail

 

del.icio.us

 

 

Blogger

 

 

last.fm

 

 

Tabblo

 

 

 

 

轻松调侃类 YouTube

 

 

SnapFish

 

 

Fanpop

 

 

Digg

 

 

Flickr

 

 

Technorati

 

 

Zooomr

 

 

 

 

 

夸张搞笑类 Bloglines

 

 

 

 

Ning

 

 

Twitter

 

 

Reddit

 

 

ClaimID

 

 

MySpace

 

 

 

 

 

绝妙极品类

WordPress(以文字取胜)

 

 

译文:服务器的自白 唉!老天何其不公!身为一台服务器生在这个时代何错之有?!我宁愿变成一辆普普通通的单车,也能驮着人无拘无束的快乐游玩。可残酷的现实是:我只能被固定在铁箱子里处理网页,不见天日,唯一作伴的只有吹来吹去的空调。 现在好了,当机了,整个世界清净了。我终于可以泡杯热茶、吃块饼干,悠闲的等着他们注意到我了。别担心,一旦这事引发混乱,他们会手脚麻利的把我修好的。所以等一会儿你再来看,就会发现我又开始自得其乐的工作了。 WordPress.com服务器

(WordPress.com,机器也有生命)

Flickr(以创意取胜)

 

PS:在网络上随意看到这篇文章,当机页面各具特色,觉的他们的心态很好,别具一格。不管将来遇到什么事,处理什么事,都可以换一种思维方式,或者,会有更有意思的事情,HOHO
Categories: 网站开发 Tags: