服务器端简介
欢迎来到 MDN 初学者服务器端编程课程!在本文中,我们将从高层视角审视服务器端编程,回答诸如“它是什么?”、“它与客户端编程有何不同?”以及“为什么它如此有用?”等问题。阅读本文后,您将了解通过服务器端编码为网站带来的额外功能。
| 预备知识 | 对什么是 Web 服务器有基本的了解。 |
|---|---|
| 目标 | 熟悉什么是服务器端编程,它能做什么,以及它与客户端编程有何不同。 |
大多数大型网站都使用服务器端代码在需要时动态显示不同的数据,这些数据通常从存储在服务器上的数据库中提取,并通过一些代码(例如 HTML 和 JavaScript)发送到客户端进行显示。
服务器端代码最显著的好处也许是它允许您为单个用户量身定制网站内容。动态网站可以根据用户的偏好和习惯突出显示更相关的内容。它还可以通过存储个人偏好和信息使网站更易于使用——例如,重复使用存储的信用卡详细信息以简化后续付款。
它甚至可以允许与网站用户互动,通过电子邮件或其他渠道发送通知和更新。所有这些功能都能实现与用户的更深入互动。
在现代 Web 开发世界中,强烈建议学习服务器端开发。
什么是服务器端网站编程?
Web 浏览器使用 HyperText Transfer Protocol (HTTP) 与Web 服务器通信。当您点击网页上的链接、提交表单或运行搜索时,一个 HTTP 请求会从您的浏览器发送到目标服务器。
该请求包含一个用于标识受影响资源的 URL,一个定义所需操作的方法(例如获取、删除或发布资源),并且可能包含编码在 URL 参数中(通过查询字符串发送的字段-值对)、作为 POST 数据(通过HTTP POST 方法发送的数据)或在相关cookie中的附加信息。
Web 服务器等待客户端请求消息,在收到后对其进行处理,并使用 HTTP 响应消息回复 Web 浏览器。响应包含一个状态行,指示请求是否成功(例如,成功时为“HTTP/1.1 200 OK”)。
成功请求的响应主体将包含请求的资源(例如,一个新的 HTML 页面或一张图片),然后 Web 浏览器可以显示该资源。
静态网站
下图显示了*静态网站*的基本 Web 服务器架构(静态网站是指在请求特定资源时,服务器返回相同的硬编码内容的网站)。当用户想要导航到某个页面时,浏览器会发送一个 HTTP "GET" 请求,并指定其 URL。
服务器从其文件系统中检索请求的文档,并返回包含该文档和成功状态(通常为 200 OK)的 HTTP 响应。如果由于某种原因无法检索文件,则返回错误状态(请参阅客户端错误响应和服务器错误响应)。

动态网站
动态网站是指部分响应内容是*动态*生成,仅在需要时生成。在动态网站上,HTML 页面通常是通过将数据库中的数据插入到 HTML 模板中的占位符来创建的(这是一种比使用静态网站存储大量内容更有效的方式)。
动态网站可以根据用户提供的信息或存储的偏好,为同一个 URL 返回不同的数据,并可以在返回响应时执行其他操作(例如,发送通知)。
支持动态网站的大部分代码必须在服务器上运行。创建此代码称为“服务器端编程”(或有时称为“后端脚本”)。
下图显示了*动态网站*的架构。与上图一样,浏览器向服务器发送 HTTP 请求,然后服务器处理请求并返回适当的 HTTP 响应。
对*静态*资源的请求以与静态站点相同的方式处理(静态资源是指任何不改变的文件——通常是:CSS、JavaScript、图片、预创建的 PDF 文件等)。

对动态资源的请求则转发 (2) 到服务器端代码(在图中显示为*Web 应用程序*)。对于“动态请求”,服务器解释请求,从数据库中读取所需信息 (3),将检索到的数据与 HTML 模板组合 (4),并发送回包含生成的 HTML 的响应 (5,6)。
服务器端和客户端编程是一样的吗?
现在让我们关注服务器端和客户端编程中涉及的代码。在每种情况下,代码都大相径庭。
- 它们有不同的目的和关注点。
- 它们通常不使用相同的编程语言(JavaScript 是例外,它可以在服务器端和客户端使用)。
- 它们在不同的操作系统环境中运行。
在浏览器中运行的代码被称为**客户端代码**,主要关注改进渲染网页的外观和行为。这包括选择和样式化 UI 组件、创建布局、导航、表单验证等。相比之下,服务器端网站编程主要涉及选择*哪些内容*作为请求的响应返回给浏览器。服务器端代码处理的任务包括验证提交的数据和请求、使用数据库存储和检索数据以及根据需要向客户端发送正确的数据。
客户端代码使用HTML、CSS 和JavaScript 编写——它在 Web 浏览器中运行,并且几乎或完全无法访问底层操作系统(包括对文件系统的有限访问)。
Web 开发者无法控制每个用户可能使用什么浏览器来查看网站——浏览器对客户端代码功能的兼容性水平不一致,客户端编程的挑战之一就是优雅地处理浏览器支持方面的差异。
服务器端代码可以用多种编程语言编写——流行的服务器端 Web 语言包括 PHP、Python、Ruby、C# 和 JavaScript (NodeJS)。服务器端代码可以完全访问服务器操作系统,开发者可以选择他们希望使用的编程语言(和特定版本)。
开发者通常使用**Web 框架**编写代码。Web 框架是函数、对象、规则和其他代码结构的集合,旨在解决常见问题、加快开发速度并简化特定领域中面临的不同类型的任务。
同样,尽管客户端和服务器端代码都使用框架,但它们的领域截然不同,因此框架也不同。客户端 Web 框架简化了布局和展示任务,而服务器端 Web 框架提供了许多您可能需要自己实现的“通用”Web 服务器功能(例如,对会话的支持、对用户和身份验证的支持、简易的数据库访问、模板库等)。
注意:客户端框架通常用于帮助加快客户端代码的开发,但您也可以选择手动编写所有代码;事实上,如果您只需要一个小型、简单的网站 UI,手动编写代码可能会更快、更高效。
相比之下,你几乎不会考虑在没有框架的情况下编写 Web 应用程序的服务器端组件——从头开始用 Python 等语言实现 HTTP 服务器这样重要的功能真的很难,但像 Django 这样的 Python Web 框架开箱即用,并提供其他非常有用的工具。
您可以在服务器端做什么?
服务器端编程非常有用,因为它允许我们*高效地*为单个用户提供定制的信息,从而创造更好的用户体验。
像亚马逊这样的公司使用服务器端编程来构建产品搜索结果,根据客户偏好和以前的购买习惯提出有针对性的产品建议,简化购买流程等。
银行使用服务器端编程存储账户信息,并且只允许授权用户查看和进行交易。其他服务,如 Facebook、Twitter、Instagram 和维基百科,使用服务器端编程来突出显示、共享和控制对有趣内容的访问。
以下列出了一些服务器端编程的常见用途和好处。您会注意到其中有一些重叠!
信息的有效存储和传输
想象一下亚马逊上有多少产品,以及 Facebook 上发布了多少帖子?为每个产品或帖子创建单独的静态页面是完全不切实际的。
服务器端编程允许我们将信息存储在数据库中,并动态构建和返回 HTML 和其他类型的文件(例如 PDF、图像等)。也可以返回数据(JSON、XML 等),供适当的客户端 Web 框架渲染(这减少了服务器的处理负担和需要发送的数据量)。
服务器不仅限于发送数据库中的信息,还可以返回软件工具的结果或来自通信服务的数据。内容甚至可以针对接收它的客户端设备类型进行定制。
因为信息存储在数据库中,所以它也可以更容易地与其他业务系统共享和更新(例如,当产品在线销售或在商店销售时,商店可能会更新其库存数据库)。
注意:您无需费力想象即可看到服务器端代码在高效存储和传输信息方面的优势
- 访问亚马逊或其他电子商务网站。
- 搜索多个关键字,并注意即使结果发生变化,页面结构也不会改变。
- 打开两到三个不同的产品。再次注意它们具有共同的结构和布局,但不同产品的内容已从数据库中提取。
对于一个常见的搜索词(例如“鱼”),您可以看到数百万个返回结果。使用数据库可以高效地存储和共享这些结果,并且可以在一个地方控制信息的呈现。
定制用户体验
服务器可以存储和使用有关客户的信息,以提供方便和定制的用户体验。例如,许多网站存储信用卡,这样就不必再次输入详细信息。像 Google Maps 这样的网站可以使用保存的或当前的位置来提供路线信息,以及搜索或旅行历史记录来突出显示搜索结果中的本地商家。
对用户习惯的更深入分析可以用来预测他们的兴趣并进一步定制响应和通知,例如提供一个您可能想在地图上查看的以前访问过的或热门地点的列表。
受控的内容访问
服务器端编程允许网站限制对授权用户的访问,并只提供用户被允许查看的信息。
实际示例包括社交网络网站,它们允许用户决定谁可以看到他们发布到网站上的内容,以及谁的内容出现在他们的动态中。
注意:考虑其他实际示例,其中对内容的访问受到控制。例如,如果您访问银行的在线网站,您能看到什么?登录您的账户——您能看到和修改哪些额外信息?您能看到哪些只有银行才能更改的信息?
存储会话/状态信息
服务器端编程允许开发人员利用**会话**——基本上,它是一种机制,允许服务器存储与网站当前用户相关的信息,并根据该信息发送不同的响应。
这允许,例如,网站知道用户以前登录过,并显示其电子邮件或订单历史记录的链接,或者可能保存一个简单游戏的状态,以便用户可以再次访问网站并从上次离开的地方继续。
注意:访问一个有订阅模式的报纸网站并打开一堆标签(例如The Age)。在几个小时/几天内继续访问该网站。最终,您将开始被重定向到解释如何订阅的页面,并且您将无法访问文章。此信息是存储在 cookie 中的会话信息的示例。
通知和通信
服务器可以通过网站本身或通过电子邮件、短信、即时消息、视频通话或其他通信服务发送通用或特定于用户的通知。
几个例子包括
- Facebook 和 Twitter 发送电子邮件和短信通知您新的通信。
- 亚马逊定期发送产品电子邮件,推荐与您已购买或查看的产品相似且您可能感兴趣的产品。
- Web 服务器可能会向网站管理员发送警告消息,提醒他们服务器内存不足或存在可疑用户活动。
注意:最常见的通知类型是“注册确认”。选择您感兴趣的几乎任何大型网站(Google、Amazon、Instagram 等),并使用您的电子邮件地址创建一个新帐户。您很快就会收到一封电子邮件,确认您的注册,或要求确认以激活您的帐户。
数据分析
网站可能会收集大量关于用户的数据:他们搜索什么,他们购买什么,他们推荐什么,他们在每个页面上停留多长时间。服务器端编程可以用于根据对这些数据的分析来优化响应。
例如,亚马逊和谷歌都根据之前的搜索(和购买)来推广产品。
注意:如果您是 Facebook 用户,请进入您的主动态并查看帖子流。请注意有些帖子的顺序不是按时间顺序的——特别是,获得更多“赞”的帖子通常比最近的帖子排在列表的前面。
也看看您看到了什么样的广告——您可能会看到在其他网站上浏览过的商品的广告。Facebook 突出内容和广告的算法可能有点神秘,但很明显它确实取决于您的喜好和浏览习惯!
总结
恭喜,您已完成关于服务器端编程的第一篇文章。
您现在已经了解到服务器端代码在 Web 服务器上运行,其主要作用是控制*哪些*信息发送给用户(而客户端代码主要处理数据的结构和向用户的呈现)。
您还应该理解它之所以有用,是因为它允许我们创建能够*高效地*为单个用户提供定制信息的网站,并且您对成为服务器端程序员后能够做的一些事情有很好的了解。
最后,您应该明白服务器端代码可以用多种编程语言编写,并且您应该使用 Web 框架来使整个过程更容易。
在未来的文章中,我们将帮助您为您的第一个网站选择最佳的 Web 框架。在这里,我们将更详细地向您介绍主要的客户端-服务器交互。