先说说什么是静态地址和动态地址。www.a.com/b.html是静态地址,而www.a.com/b.asp或www.a.com/b.jsp是动态地址,静态地址指向的是实际存在于服务器上的文件,而动态地址指向的并不是实际存在的文件,而是由服务器根据客户端请求通过程序动态生成的页面。很多动态地址都含有参数,形如www.a.com/b.asp?name=pete&id=123, 服务器应用收到这个url请求后解析出参数pete和123,通过查询数据库和逻辑计算生成html传给客户端.
再解释什么是伪静态。伪静态,即通过一定的技术将动态生成的页面的url地址以静态的url形式展现给用户,例如用用户在浏览器中访问www.a.com/b.html页面,但实际上服务器端传给浏览器的是www.a.com/b.asp程序生成的页面。伪静态提出的目的是为了迎合搜索引擎,为了让搜索爬虫搜索自己的几率更大,因为爬虫一般尽量不去搜索动态地址。
实现伪静态的一个方法是重新实现HTTP 404 错误(即请求的页面不存在),当用户向服务器请求一个不存在的静态地址时便发生了该错误,发生错误时应用程序就重新解析请求的静态地址,计算得出正确的动态地址并将请求发给这个正确的动态地址对应的页面程序,动态页面生成后返送给客户端显示在用户的浏览器上。此时客户端浏览器的url并没有改变。于是,对用户来说,仿佛请求的静态url是实际存在的。
在上述实现伪静态的方法中涉及客户端url跳转和服务器端url跳转两个概念。服务器将客户端请求转发给其他的动态页面去处理,这是服务器端url跳转。而服务器发生url跳转时浏览器地址却没有跳转是源于客户端url跳转的原理。
下面具体说服务器端url跳转和客户端url跳转。
先来说说客户端url跳转,即浏览器url的跳转。浏览器url跳转有两种方式:
1、浏览器自己执行跳转命令。如用户点击html中的a标签后浏览器就执行url跳转指令跳转到这个url,同时向服务器发送新的url的http请求,请求返回的数据内容显示在客户端浏览器。这里服务器和浏览器有一次交互,就是浏览器向服务器请求新的url的内容,服务器返回页面内容。
2、服务器向客户端发送url跳转指令。如点击页面上可以触发服务器事件的按钮,若此服务事件程序里面有页面跳转的指令,则执行到此指令的时候服务器就会向客户端发送url跳转指令,浏览器收到指令后跳转url,同时向服务器发送新url的http请求并显示请求返回的内容。这里客户端和服务器经过了两次交互,第一次客户向服务器触发按钮事件,服务器通知浏览器跳转url;第二次浏览器向服务器请求新的url的内容,服务器返回页面内容。
再说服务器端url跳转。它指的是收到http请求的服务器端页面和实际处理并返送回浏览器的页面不一定是同一个页面。服务器收到客户端的一个url请求后,可以将这个请求转交给其他的页面去执行,如请求的是a.asp页面,可以转给b.asp页面去响应,响应的内容再返送给客户端浏览器,此时服务器并没有向浏览器发送url跳转指令,所以客户端浏览器的url不会改变,于是浏览器中的地址为a.asp而内容却是b.asp的。
综上,客户端和服务器端url跳转是完全不同的概念。而伪静态的实现正式利用了服务器端url跳转而不影响客户端url的原理。
给用户一个静态的html地址,这个地址包含真实的web应用地址和一些参数,如www.webying.com/123.html,这其中www.webying.com是服务端应用的地址,123是相关参数,浏览器向www.webying.com服务发送url请求后,服务器会曝出所请求的页面不存在的错误,我们可以自定义这个错误的页面,即服务出现这个错误的时候就跳转到一个专门处理页面,在这个页面内我们从这个错误的url中解析并组装出真实的url请求地址,如www.webying.com/a.asp?param=123,再通过服务器端url跳转将请求发给www.webying.com/a.asp页面,由他去生成页面数据内容返送给客户端,。在客户端,url没有改变,页面内容发生的变化。这就是静态的url地址却可以执行动态的页面。
这个,联系到一个问题,无论怎么伪装,动态的终究是动态的,那么爬虫去爬这些伪静态url的时候不就会发生当初不去爬动态url的问题了吗,不知搜索引擎如何对付这一问题的呢?