Web的历史2️⃣-动态网页
上篇文章我们已经了解了静态网页是如何工作的,但是这样的网页是不能满足大家对互联网的需求的。举例子来说:你访问b站首页bilibili.com,每次刷新,首页上显示给你的视频都不一样,不同的人访问这个首页,显示的也不一样,按理说大家都是访问一个网址,背后应该都是同一个文件,为什么每个人都不一样呢?这种功能是如何实现的?
淘宝上有数不清的商品在售卖,如果淘宝为每一个商品都在服务器目录下面创建一个html文件,好让大家通过访问http://taobao.com/someproduct.html来查看商品信息,那这个工作量就非常大了。而且,这样的网页,基本上没有交互的功能:我们希望用户可以点击按钮就能购买商品,商家在网页后台上操作就能上传商品。这种功能应该如何实现呢?
暂时先不考虑这些高级的问题,让我们先从最基础的讲起:
服务器端内嵌(SSI)
如果你想向网站中插入动态内容,SSI是最简单,最直接的办法,比如我们的wiki有许多页面,但是每个页面都有一些共同的元素:页面头部的导航栏,左侧的列表,页脚等。如果为每个页面都复制一份相同的HTML的话,那就太麻烦了,有没有什么办法,可以使HTML一次编写,到处渲染呢?
SSI(Server Side Includes)就是满足这种需求的一个HTML宏语言。它有点类似于C语言的# include宏:
假设这是我们首页的HTML:
<h1>wiki</h1>
<!--#include file="navbar.html" -->
<div class="article"></div>
假如navbar.html的内容如下:
<tr>
<td>教程</td>
<td>文档</td>
<td>高级</td>
<td><a href="github.com/zscnsd/website">Github</a></td>
</tr>
那么用户访问我们首页时就会看到:
<h1>wiki</h1>
<tr>
<td>教程</td>
<td>文档</td>
<td>高级</td>
<td><a href="github.com/zscnsd/website">Github</a></td>
</tr>
<div class="article"></div>
如果导航栏的界面有变化,那么只需要修改navbar.html即可,不用修改网站中的每一个页面。
没错,SSI的功能就是简单地把制定的内容插入进HTML里。这对一些重复的元素(例如每个网页的页头,页脚,侧边栏)还有一些需要更新的内容很实用。
当然,SSI并没有解决动态网页的问题,它只是把需要手动更新的地方单独拿了出来,使维护静态网站更容易,所以程序员们又发明了CGI技术。
CGI
CGI(Common Gateway Interface) 是第一个真正实现动态网页的技术,它允许Web服务器执行外部程序来生成网页内容。
CGI的工作原理是:当用户访问特定URL时,服务器不是返回静态文件,而是执行一个程序,并将程序的输出作为HTTP响应返回给用户。
(举个天气预报的例子):
Web服务器通常会把能执行的程序(除开静态文件)放在一个叫cgi-bin的特殊目录里。假设我们服务器的这个文件夹里有一个查询天气的Python程序weather.py,当用户访问http://example.org/cgi-bin/weather.py?city=中山&date=2025-06-25时,我们的HTTP服务程序会自动执行放在路径中/cgi-bin/weather.py