⌨️ 第六章 Web技术与安全
📄 本篇一句话

静态网站像发传单(人人同一份),动态网站像柜台服务(见人下菜碟)——CGI 是两者之间的历史分水岭:让 Web 服务器第一次能调用外部程序现做内容。

📝 在本章的位置

上游:6-1 的 HTTP 一问一答、6-4 的会话认人;树莓派课 5-1~5-3 已经在真机上把「Apache+PHP+MariaDB」的动态网站三件套亲手搭过一遍。下游:6-6 的 MVC 是动态网站代码的组织法。

一、静态 Web 网站:照本宣科

服务器硬盘上躺着现成的 .html/.css/.js 文件,谁来要都原样发同一份:

二、动态 Web 网站:见人下菜

每个请求现做:服务器跑一段程序,查数据库、拼 HTML 再回:

浏览器请求 /todo → 服务器执行程序 → 查数据库 → 拼出「波仔的 2 件待办」→ 回 HTML

三、CGI:动态化的第一次握手

CGI(Common Gateway Interface,公共网关接口,1993)是服务器与外部程序之间的调用约定:来一个请求 → 启动一个新进程跑脚本 → 脚本把结果打到标准输出 → 服务器转手发回浏览器。

动手 Demo:同一台服务器,静态与动态各来一次

# demo_web.py —— 用内置库当一个「迷你 Web 服务器」
from http.server import BaseHTTPRequestHandler, HTTPServer
import datetime

class H(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-Type", "text/html; charset=utf-8")
        self.end_headers()
        if self.path == "/static":
            self.wfile.write("<h1>静态页:谁来都这行字</h1>".encode())
        elif self.path == "/dynamic":
            now = datetime.datetime.now().strftime("%H:%M:%S")
            self.wfile.write(f"<h1>动态页:这一刻是 {now}</h1>".encode())

HTTPServer(("127.0.0.1", 8000), H).serve_forever()

看到什么算成功:浏览器开 http://127.0.0.1:8000/static 刷新十次,文字一个字不变;开 /dynamic 刷新十次,秒数每秒都变。

读结果:静态路径回的是写死的字符串;动态路径每次请求现算时间现拼 HTML——「动态」的定义如此朴素。

30 秒实验

访问任意新闻网站的文章页,按 Ctrl+S 把页面存下来;明天同一时刻看本地存的这份——广告区、评论区大概率变了(动态),正文一个字没变(静态化的内容)。大多数现代网站是静态动态的混合体。

常见误区

自测三问(点击展开) 1. **静态与动态网站的判断标准?** 答:内容是否按请求现生成——静态发死文件,动态跑程序查数据现拼。 2. **CGI 的贡献与死穴?** 答:贡献=让服务器能调外部程序(动态化起点);死穴=每请求开新进程太重,扛不住并发。 3. **2026 年服务端语言部署份额第一是谁?** 答:PHP(约 70%,W3Techs)——部署惯性远大于开发者热度。

相关笔记