浏览器的加载与页面性能优化

本文将探讨浏览器渲染的loading过程,主要有2个目的:

  • 了解浏览器在loading过程中的实现细节,具体都做了什么
  • 研究如何根据浏览器的实现原理进行优化,提升页面响应速度

由于loading和parsing是相互交织、错综复杂的,这里面有大量的知识点,为了避免过于发散本文将不会对每个细节都深入研究,而是将重点放在开发中容易控制的部分(Web前端和Web Server),同时由于浏览器种类繁多且不同版本间差距很大,本文将侧重一些较新的浏览器特性

现有知识

提升页面性能方面已经有很多前人的优秀经验了,如Best Practices for Speeding Up Your Web SiteWeb Performance Best Practices

本文主要专注其中加载部分的优化,总结起来主要有以下几点: Continue reading

SEO URL的优化方案【转】

针对搜索引擎优化(SEO),页面URL的布局与呈现是影响排名和网站索引率的重要因素之一。对于搜索引擎而言,URL是它们找到一个网页的入口,URL的好坏会直接影响搜索引擎对一个网站的索引及理解程度。对于用户,URL会直接显示在搜索结果中,从而影响人们的点击意愿。因此一个好的URL结构无论是对搜索引擎,还是用户,都有着非常重要的作用。在本文中,我们将详细探讨针对SEO的URL优化技巧,但同时也想提醒大家,对于一个现有的网站,URL的改动需要谨慎。URL的改动会牵扯到原有URL权重的转移等问题,因此除非在万不得已的情况下,尽量不要改动现有的URL。但如果你是在策划一个新的网站或者生成新的页面,那么就让我们来探讨一下如何得到一个完美的URL吧。
1. URL愈短愈好
无论是搜索引擎,还是浏览者,都喜欢简短的URL。URL的层级不宜过多,尽量控制在4级之内。虽然搜索引擎仍然会抓取四级之后的页面,但页面的权重会大大降低。 Continue reading

Apache 网站访问速度提升优化

Yahoo 开 发者网站上,Yahoo 提出了优 化网站性能的N条规则(Best Practices for Speeding Up Your Web Site)。这些规则是:

1. 尽可能的减少 HTTP 的请求数(Minimize HTTP Requests) —— Tag: content

2. 使用 CDN(Use a Content Delivery Network) —— Tag: server

3. 添加 Expires 头(或者 Cache-control ) (Add an Expires or a Cache-Control Header) —— Tag: server

4. Gzip 组件(Gzip Components) —— Tag: server

5. 将 CSS 样式放在页面的上方 (Put Stylesheets at the Top) —— Tag: css

6. 将脚本移动到底部(包括内联的)(Put Scripts at the Bottom) —— Tag: javascript Continue reading

Apache Cache Last-Modified、Expires和Etag相关工作原理

使用ETag和Expires调优web 服务器性能

正确使用Etag和Expires标识处理,可以使得页面更加有效被Cache。

在客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应同时记录相关属性标记(Http Reponse Header),服务器端的返回状态会是200,格式类似如下: Continue reading

把不带前缀的域名转向到www.域名的Apache 301转向配置样例

各种不同的域名地址对于搜索引擎的除重(deduplication)来说是一个负担,有没有”/”和首页的文件连接,一个域名首页就可以有6个地址:
www.haohtml.com/
haohtml.com/
www.haohtml.com
haohtml.com
www.haohtml.com/index.php
haohtml.com/index.php

如果加上一些参数,比如用于来源跟踪等还会有更多无穷无尽的地址。
www.haohtml.com/?source=foobar

所以搜索引擎鼓励发布者把URL标准化(归一化)。首先就是域名的归一化,原先我的设置为: www.haohtml.com / haohtml.com为别名。现在改为haohtml.com 301转向到www.haohtml.com
<VirtualHost *:80>
ServerName haohtml.com
RewriteEngine on
RewriteRule ^(.*)$ http://www.haohtml.com$1 [R=301,L]
</VirtualHost>

如果没有mod_rewrite也可以设置mod_alias:
RedirectMatch 301 ^(.*)$ http://www.haohtml.com

搜索引擎和网站的目录结构

对一个网站来说,搜索引擎是否会检索其子目录下的网页?

譬如对于http://www.Google8.net/archives/000062.html ,搜索引擎是否会索引?敷衍了事的答案是“会”。对一个站点中包含的子目录,只要链向该层子目录的链接提供有搜索引擎能够跟进的导航配置和URL结构,那么所有的搜索引擎都会对子目录提供遍历。网络目录结构 理想情况下,尤其对于一个规模比较小的站点来说,其目录结构应该是单一的(flat),即对实际的网页不存在或只有一层子目录。而对规模大一些的站点来说,两到三层子目录是最理想的。从搜索引擎的角度看,一个单一的目录结构为最佳。图形、脚本、CGI-BIN和样式表除外。它们应被放入子目录中而不是根目录下。

URL结构同时向搜索引擎和你的访问者清晰地表明了在你的网站中,你认为哪些网页是最重要的。换言之,如果你觉得有一个页面是非常重要的,则该网页的URL就应使用顶级URL而不应将其放在子目录下。
顶级网页的URL结构一般如下所示:
http://www.Google8.net/Google.html
含一层子目录的URL结构一般为:
http://www.Google8.net/archives/000063.html  其中:Google8.net是域名,archives一级子目录名,000063.html是网页名。
含两层子目录的URL的结构一般为:
http://www.wuyue.cn/curtain/2/product1.html  其中:wuyue.cn是域名,curtain是一级子目录名,2是二级子目录名,product1.html是二级子目录下网页名,等等,依此类推。

在对一个网站的检索中,只要你的网站提供有搜索引擎能够跟进的导航配置和URL结构,则搜索引擎通常会遍历至少三层子目录。不过,比子目录的层次数更为重要的一点却是:在你的子目录下是否有来自其它网站的外部链接。假如你的网站有第四层目录,且在该目录下提供了非常重要的内容,同时又包含了大量的外部链接,那么你尽可以放心,搜索引擎照样会对你的这个第四层目录进行检索的。
搜索引擎营销的小伎俩

在搜索引擎的营销中,有很多搜索引擎营销商都喜欢使用这样一个小伎俩:由于他们知道搜索引擎会自动检索多层子目录,于是他们就有意用复合关键词/短语专门创建一个子目录,以确保搜索引擎能够看到这个目标关键词。但在我看来,这种伎俩其实不会有什么实际的效果,因而并不可取。

例如,一个销售有机茶的公司,如果使用以上策略,则可能有如下的URL和目录结构:
http://www.tranquiliteasorganic.com/Oolong-tea/Oolong.html
其中:
1. tranquiliteasorganic.com是域名。
2. Oolong-tea是一级子目录名,在其域名中包含了关键词“oolong tea”,以连字符分开。
3. Oolong.html是二级目录下的网页名。
对使用了子目录的URL结构http://www.tranquiliteasorganic.com/Oolong-tea/Oolong.html ]和顶级URL http://www.tranquiliteasorganic.com/Oolong.html ,哪一种要更好呢?对我来说,我是不会纯粹为了能够在搜索引擎中取得好排名而去更改子目录结构的。原因就在于在域名或URL中使用关键词这个办法或者压根不重要,或者效果微乎其微。
我的答案要取决于这是一个什么样的网站。如果有机乌龙茶有很多种,而且这个网站提供了相当数量的关于乌龙茶的内容独特和质量高的网页,那么我推荐使用子目录结构。同样,为了保证网站的一致性和易用性,我还希望他们能够为提供的所有类型的茶都设立子目录。可是既然我很难相信会有大量关于乌龙茶的内容独特和质量高的网页,因而我怀疑这个子目录是否有必要。使用Robots Exclusion Protocol协议(拒绝Robots访问协议)

在一个用数据库驱动的网站上,在不同子目录中放入类似或完全相同的内容是颇为普遍的,因为这样可以提高用户体验。

我们再以上面的那个茶叶站点为例,假设该站点对每种茶叶都设立了不同子目录,并提供有大量内容独特和高质量的网页,那么对乌龙茶(oolong tea),绿茶(green tea)和茶具这三者,它们的URL结构分别如下:
1. 乌龙茶页:http://www.tranquiliteasorganic.com/Oolong-tea/Oolong.html
2. 绿茶页:http://www.tranquiliteasorganic.com/Green-tea/Green.html
3. 茶具页:http://www.tranquiliteasorganic.com/Tea-accessories/accessories.html
如果该网站亦提供有散装的乌龙茶和绿茶,那么对于该网站下一个关于泡茶茶具的网页,将其放入乌龙茶,绿茶和茶具子目录这三个目录下也是合乎逻辑的。从易用性和用户体验的角度来看,这不失为一个好策略。然而对于搜索引擎来说,它们却往往把这样的内容视为冗余内容。搜索引擎不喜欢比较多数据库驱动的站点的一个原因就是,它们常常一次又一次地得到相同的内容。

因而,如果泡茶茶具这个网页在上述三个一级子目录中都存在,搜索引擎是否会认为这是冗余内容,而且可能因为这个站点提供这样的内容而处罚它呢?最有可能发生的是,搜索引擎只显示该网站上包含很多链入链接的那个网页,而不会显示网站上的其它网页。

同时,也有很多缺乏职业道德的搜索引擎营销商过分使用该策略,对完全相同的信息生成大量冗余内容。因而极有可能被搜索引擎认为是SPAM而受到处罚。

为了使网站百分百的安全,你可以在网站的冗余内容中放入一个纯文本文件robots.txt(Robots Exclusion Protocol),在这个文件中声明该网站中不想被robot访问的部分,这样就可以限定搜索引擎对你网站的检索范围。不过,你还需要对站点的统计数据进行仔细的分析,看看哪个子目录是最常用到的,对这样的子目录可不要放robots.txt文件哦。

在上述情形下,使用robots.txt文件解决了两个问题。首先,它向搜索引擎传达了你并非故意传输冗余内容。其次,由于相关的容在适当的子目录下仍然有效,所以对用户体验并无负面影响。

结论:一般来讲,搜索引擎在对子目录的检索上不存在问题。如果你发现把你的网站划分为子目录结构能够为用户提供更好的用户体验,那么你尽可以这么做。但是不要只是为了引起搜索引擎的注意而创建子目录。有许多策略都能够达到这样的目的,它们不但无需花费你很多时间,而且还会给你的网站带来比较好的投资回报(ROI)。

这个用户提出的问题引出了在搜索引擎业界中引发激烈争论的问题:一个网站何时使用子目录(subdirectories),子域(subdomains)或迷你网站(mini-sites)最合适?网站业主是否应利用目标关键短语创建自己网站的URL?是否子目录的名称中应包含关键短语?那又是后话了。

面向搜索引擎的URL设计

不得不承认,将动态网页链接rewriting成静态链接是最保险和稳定的面向搜索引擎优化方式。

此外随着互联网上的内容以惊人速度的增长也越来越突出了搜索引擎的重要性,如果网站想更好地被搜索引擎收录,网站设计除了面向用户友好(User Friendly)外,搜索引擎友好(Search Engine Friendly)的设计也是非常重要的。进入搜索引擎的页面内容越多,则被用户用不同的关键词找到的几率越大。在Google的算法调查一文中提到一个站点被Google索引页面的数量其实对PageRank也是有一定影响的。由于Google 突出的是整个网络中相对静态的部分(动态网页索引量比较小),链接地址相对固定的静态网页比较适合被Google索引(怪不得很多大网站的邮件列表归档和BLOG按日期归档的文档很容被搜的到),因此很多关于面向搜索引擎 URL设计优化(URI Pretty)的文章中提到了很多利用一定机制将动态网页参数变成像静态网页的形式。比如可以将:

http://phpunixman.sourceforge.net/index.php?mode=man¶meter=ls

变成:

http://phpunixman.sourceforge.net/index.php/man/ls

实现方式主要有2种:

基于url rewrite
IIS的ISAPI REWRITE下载(免费)
基于path_info
把URI地址用作参数传递:URL REWRITE

最简单的是基于各种WEB服务器中的URL重写转向(Rewrite)模块的URL转换:这样几乎可以不修改程序的实现将 news.asp?id=234 这样的链接映射成 news/234.html,从外面看上去和静态链接一样。Apache服务器上有一个模块(非缺省):mod_rewrite:URL REWRITE功能之强大足够写上一本书。

当我需要将将news.asp?id=234的映射成news/234.html时,只需设置:
RewriteRule /news/(d+).html /news.asp?id=$1 [N,I]
这样就把 /news/234.html 这样的请求映射成了 /news.asp?id=234
当有对/news/234.html的请求时:web服务器会把实际请求转发给/news.asp?id=234

而在IIS也有相应的REWRITE模块:比如ISAPI REWRITE和IIS REWRITE,语法都是基于正则表达式,因此配置几乎和apache的mod_rewrite是相同的:

比对于某一个简单应用可以是:
RewriteRule /news/(d+).html /news/news.php?id=$1 [N,I]
这样就把 http://www.chedong.com/news/234.html 映射到了 http://www.chedong.com/news/news.php?id=234

一个更通用的能够将所有的动态页面进行参数映射的表达式是:
把 http://www.myhost.com/foo.php?a=A&b=B&c=C
表现成 http://www.myhost.com/foo.php/a/A/b/B/c/C。
RewriteRule (.*?.php)(?[^/]*)?/([^/]*)/([^/]*)(.+?)? $1(?2$2&:?)$3=$4?5$5: [N,I]

一下是真对phpBB的一个Apache mod_rewrite配置样例:
mod_rewrite和isapirewrite基本兼容,但是还是有些不同,比如:isapirewrite中”?”需要转义成”?”,mod_rewrite不用,isapirewrite支持 “d+” (全部数字),mod_rewrite不支持
RewriteEngine On
RewriteRule /forum/topic_(.+).html$ /forum/viewtopic.php?t=$1 [L]
RewriteRule /forum/forum_(.+).html$ /forum/viewforum.php?f=$1 [L]
RewriteRule /forum/user_(.+).html$ /forum/profile.php?mode=viewprofile&u=$1 [L]

这样设置后就可以通过topic_1234.html forum_2.html user_34.html这样的链接访问原来的动态页面了。
通过URL REWRITE还有一些好处:

隐藏后台实现:这在后台应用平台的迁移时非常有用:当从asp迁移到java平台时,对于前台用户来说,根本感受不到后台应用的变化;
简化数据校验:因为像(d+)这样的参数,可以有效的控制数字的格式甚至位数;
比如我们需要将应用从news.asp?id=234迁移成news.php?query=234时,前台的表现可以一直保持为 news/234.html。从实现应用和前台表现的分离:保持了URL的稳定性,而使用mod_rewrite甚至可以把请求转发到其他后台服务器上。

基于PATH_INFO的URL美化
Url美化的另外一个方式就是基于PATH_INFO:
PATH_INFO是一个CGI 1.1的标准,经常发现很多跟在CGI后面的”/value_1/value_2″就是PATH_INFO参数:
比如http://phpunixman.sourceforge.net/index.php/man/ls,中:$PATH_INFO = “/man/ls”

PATH_INFO是CGI标准,因此PHP Servlet等都有的支持。比如Servlet中就有request.getPathInfo()方法。
注意:/myapp/servlet/Hello/foo的 getPathInfo()返回的是/foo,而/myapp/dir/hello.jsp/foo的getPathInfo()将返回的 /hello.jsp,从这里你也可以知道jsp其实就是一个Servlet的PATH_INFO参数。ASP不支持PATH_INFO,

PHP中基于PATH_INFO的参数解析的例子如下:
//注意:参数按”/”分割,第一个参数是空的:从/param1/param2中解析出$param1 $param2这2个参数
if ( isset($_SERVER[“PATH_INFO”]) ) {
list($nothing, $param1, $param2) = explode(’/’, $_SERVER[“PATH_INFO”]);
}

如何隐蔽应用:例如 .php,的扩展名:
在APACHE中这样配置:ForceType application/x-httpd-php

如何更像静态页面:app_name/my/app.html
解析的PATH_INFO参数的时候,把最后一个参数的最后5个字符“.html”截断即可。
注意:APACHE2中缺省是不允许PATH_INFO的,需要设置AcceptPathInfo on

特别是针对使用虚拟主机用户,无权安装和配置mod_rewrite的时候,PATH_INFO往往就成了唯一的选择。

OK,这样以后看见类似于http://www.example.com/article/234这样的网页你就知道可能是 article/show.php?id=234这个php程序生成的动态网页,很多站点表面看上去可能有很多静态目录,其实很有可能都是使用1,2个程序实现的内容发布。比如很多WIKIWIKI系统都使用了这个机制:整个系统就一个简单的wiki程序,而看上去的目录其实都是这个应用拿后面的地址作为参数的查询结果。

利用基于MOD_REWRITE/PATH_INFO + CACHE服务器的解决方案对原有的动态发布系统进行改造,也可以大大降低旧有系统升级到新的内容管理系统的成本。并且方便了搜索引擎收录入索引。
附:如何在IIS上利用PHP支持PATH_INFO,PHP的ISAPI模式安装备忘:只试成 php-4.2.3-Win32

解包目录
========
php-4.2.3-Win32.zip c:php

PHP.INI初始化文件
=================
复制:c:phpphp.ini-dist 到 c:winntphp.ini

配置文件关联
============
按照install.txt中的说明配置文件关联

运行库文件
==========
复制 c:phpphp4ts.dll 到 c:winntsystem32php4ts.dll

这样运行后:会发现php把PATH_INFO映射到了物理路径上
Warning: Unknown(C:CheDongDownloadsariadnewwwtest.phppath): failed to create stream: No such file or directory in Unknown on line 0

Warning: Unknown(): Failed opening ‘C:CheDongDownloadsariadnewwwtest.phppath’ for inclusion (include_path=’.;c:php4pear’) in Unknown on line 0

安装ariadne的PATCH
==================
停止IIS服务
net stop iisadmin
ftp://ftp.muze.nl/pub/ariadne/win/iis/php-4.2.3/php4isapi.dll
覆盖原有的c:phpsapiphp4isapi.dll

注:
ariadne是一个基于PATH_INFO的内容发布系统,
PHP 4.3.2 RC2中CGI模式的PATH_INFO已经修正,照常安装即可。

参考资料:
URL Rewrite文档:
ISAPI REWRITE文档
IIS的ISAPI REWRITE下载(免费)
http://httpd.apache.org/docs/mod/mod_rewrite.html
http://httpd.apache.org/docs-2.0/mod/mod_rewrite.html

搜索引擎友好的URL设计,http://www.sitepoint.com/article/485说不定这个URL原来就是articel.php?id=485

一个基于PATH_INFO的开源内容管理系统,http://typo3.com/

Google的PageRank算法说明:http://pr.efactory.de/

网站目录结构的优化

一般来讲,除垃圾站之外,很少有网站只由单页面组成,当涉及到多个尤其是成千上万页面时,往往就需要有个清晰的网站结构,来确保搜索引擎和用户的访问,网站的目录结构就起到这样的作用,它在SEO中意义非凡。

1,什么是网站的目录结构

网站的目录是指你建立网站时所创建的目录,目录结构则主要是指物理结构和逻辑结构这两种。

具体的说,网站物理结构指的是网站目录及所包含文件所存储的真实位置所表现出来的结构。对于小型网站来说,所有网页都存在网站根目录下的扁平式结构,这种单一的目录的扁平结构对搜索引擎而言是最为理想的,因为只要一次访问即可遍历。但是如果太多文件都放在根目录下的话,维护起来就显得相当麻烦;而对规模大一些的网站,往往需要二到三层甚至更多层级子目录才能保证文件内容页的正常存储,这种多层级目录也叫做树型结构,即根目录下再细分成多个频道或目录,然后在每一个目录下面再存储属于这个目录的终极内容网页,这样的好处是维护容易,但是搜索引擎的抓取将会显得困难些。

与网站的物理结构不同,网站的逻辑结构也叫链接结构,主要是指由网页内部链接所形成的逻辑结构或者叫链接的结构。这在现在的一部分CMS建站系统中已经可以实现文件虽然存在不同的物理结构目录之中,但是访问的链接的目录层级只需要一层即可转向访问。

2,网站的目录结构对SEO的影响

网站的目录结构的层级对SEO的影响很大。网站的目录层级不要太深,目录结构越简单,搜索引擎访问就越容易,目录结构层级越深,搜索引擎爬虫就越不容易抓取。

这个很简单的道理,有人说了个绝妙的比喻,就比如你急着上厕所的时候,总不会穿街走巷绕圈去,而总会优先考虑就近的厕所。囧!再举个例子,“酒香也怕巷子深”,再好的内容页,如果隐藏在太深的目录层级之下,搜索引擎也是要望洋兴叹,徒叹奈何!

3,如何优化网站结构

目录的结构往往容易被普通网站长所忽略,其实目录结构的好坏,对站点的SEO有着重要的影响。网站内部结构优化也是整个优化过程中非常重要的一个环节。那么,作为SEO,怎么去优化网站的结构呢?我想,优化网站结构应该主要涉及到物理结构和逻辑结构这两个方面。

首先,优化网站的物理结构目录。一般说来,我们不提倡将将所有文件都存放在根目录下,而鼓励按栏目内容建立子目录,并且尽量使用意义明确的目录名称,比如image,css,js,post,bbs等等名称,但是注意不要使用中文名称,尤其是针对英文的SEO优化更应该使用中文目录,目录名称也不宜太过冗长,URL应该越短越好。举个例子,我们没有必要将seo这个目录改成sousuoyinqingyouhua,因为搜索引擎看得懂seo这个词。目录和文件命名可以适当使用到关键词,如果是关键词组,需要用分隔符分开的话,我们常用连字符“-”进行分隔。

最为重要的是,网站的目录层级一般建议不要超过3层!——这是我们在SEO的过程对网站的物理结构目录最大的一个优化。这个优化如果不计SEO,其实还有很多其他的好处,比如较少层级的目录容易传播、用户体验和交换链接等等。

当然,这并不是绝对的。不管内容页所处的目录层级有多深,只要该页有一个或者大量来自其它网站的外部链接,它同样会被搜索引擎收录;如果我们在首页上增加一个该页的链接,那么其实就相当于二次点击即可访问到该页,再深的巷子如果通了条火车,同样也会顾客盈门,因此链接是被搜索引擎收录的关键。对一个站点中包含的子目录,只要链向该层子目录的链接提供有搜索引擎能够跟进的导航配置和URL结构,那么所有的搜索引擎都会对子目录提供遍历。做好导航结构,将会有效控制多层目录结构对SEO造成的不利影响。

其次,对网站的逻辑结构的优化也应该同样重视。一般来讲,首页的PR值最高,二级目录次之,最终内容页面再次之,因此为使这些页面更有效地展示出来,就要尽量减少PR流失,所以目录结构不要太深,三级已经足够,并且所有的链接应该能够做到相互回环,目录的逻辑结构也要尽量要做到符合“面包屑导航”效用。使得搜索引擎只要抓取了一个页面,就可以顺着这个页面抓取更多乃至整个站点的所有页面。另外,要注意,如果网站调整,网页目录结构改变,网页被移到一个新地址等改变网页目录结构的时候,我们都应该充分考虑到SEO,尽可能采用301重定向到新的页面,以免网站出现死链、断链、错链等问题。

4,网站目录结构在SEO排名中的具体应用方法

前面讲到,网站的目录结构的层级对SEO的影响很大,目录结构越简单,搜索引擎访问就越容易。对百度而言,它给予网站的域名、目录和页面的权重是不一样的。当参与关键词排名竞争的时候,域名级的链接在百度是最具排名优势的,目录级其次,页面级则最低。因此,当我们所关心的关键词,排名前十的大多数是页面级的站点在竞争,那我们就可以在网站之下建立一个目录来参与竞争;如果前十名都是目录级,那我们就需要用域名级来争取排名;如果前十名都是域名级,那你就要拼网站的权重和质量了。

在这里,我们还要解决一个疑问:二级域名与二级目录,即子域名和子目录,二者到底那个目录结构更容易被收录呢?

一般来说,二级目录的权重增加,可以提高主域名的权重,主域名的权重增加,也能带动二级目录的权重。二级目录是依靠着主域名权重,主域名收录完好,直接能加快二级目录收录;相比二级域名,二级域名在搜索引擎中相当于独立的网站,单就URL来看,二级域名比一级目录天生的信任度稍微高一点,但是收录中可能要比二级目录稍慢些。

如果你的网站类别不是很多,建议采用二级目录的形式,这样更有利于主打品牌的推广和提高网站权重。如果你是个类别比较多,内容比较丰富的网站,建议你采用二级域名的形式。