3月阅读周·HTTP权威指南:Web服务器之对资源的映射及访问篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议[插图])是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
Web服务器
Web服务器每天会分发出数十亿的Web页面。这些页面可以告诉你天气情况,装载在线商店的购物车,还能帮你找到许久未联系的高中同学。Web服务器是万维网的骨干。
实际的Web服务器会做些什么
Perl服务器是一个Web服务器的小例子。最先进的商用Web服务器要比它复杂得多,但它们确实执行了几项同样的任务:
(1) 建立连接——接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭。
(2)接收请求——从网络中读取一条HTTP请求报文。
(3)处理请求——对请求报文进行解释,并采取行动。
(4)访问资源——访问报文中指定的资源。
(5)构建响应——创建带有正确首部的HTTP响应报文。
(6)发送响应——将响应回送给客户端。
(7)记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中。
处理请求
一旦Web服务器收到了请求,就可以根据方法、资源、首部和可选的主体部分来对请求进行处理了。
有些方法(比如POST)要求请求报文中必须带有实体主体部分的数据。其他一些方法(比如OPTIONS)允许有请求的主体部分,也允许没有。少数方法(比如GET)禁止在请求报文中包含实体的主体数据。
对资源的映射及访问
docroot
Web服务器支持各种不同类型的资源映射,但最简单的资源映射形式就是用请求URI作为名字来访问Web服务器文件系统中的文件。通常,Web服务器的文件系统中会有一个特殊的文件夹专门用于存放Web内容。这个文件夹被称为文档的根目录(document root,或docroot)。Web服务器从请求报文中获取URI,并将其附加在文档根目录的后面。
有一条对/specials/saw-blade.gif的请求到达。这个例子中Web服务器的文档根目录为/usr/local/httpd/files。Web服务器会返回文件saw-blade.gif。
在配置文件httpd.conf中添加一个DocumentRoot行就可以为Apache Web服务器设置文档的根目录了:
DocumentRoot /usr/local/httpd/files
服务器要注意,不能让相对URL退到docroot之外,将文件系统的其余部分暴露出来。比如,大多数成熟的Web服务器都不允许这样的URI看到Joe的五金商店文档根目录上一级的文件。
1、虚拟托管的docroot
虚拟托管的Web服务器会在同一台Web服务器上提供多个Web站点,每个站点在服务器上都有自己独有的文档根目录。虚拟托管Web服务器会根据URI或Host首部的IP地址或主机名来识别要使用的正确文档根目录。通过这种方式,即使请求URI完全相同,托管在同一Web服务器上的两个Web站点也可以拥有完全不同的内容了。
服务器托管了两个站点:www.joes-hardware.com@@和www.marys-antiques.com。服务器可以通过HTTP的Host首部,或根据不同的IP地址来区分不同的Web站点。
- 当请求A到达时,服务器会获取文件/docs/joe/index.html。
- 当请求B到达时,服务器会获取文件/docs/mary/index.html。
对大多数Web服务器来说,配置虚拟托管的文档根目录是很简单的。对常见的Apache Web服务器来说,需要为每个虚拟Web站点配置一个VirtualHost块,而且每个虚拟服务器都要包含DocumentRoot。
例1-1 Apache Web服务器虚拟主机的docroot配置
<VirtualHost www.joes-hardware.com>
ServerName www.joes-hardware.com
DocumentRoot /docs/joe
TransferLog /logs/joe.access_log
ErrorLog /logs/joe.error_log
</VirtualHost>
<VirtualHost www.marys-antiques.com>
ServerName www.marys-antiques.com
DocumentRoot /docs/mary
TransferLog /logs/mary.access_log
ErrorLog /logs/mary.error_log
</VirtualHost>
...
2、用户的主目录docroot
Docroot的另一种常见应用是在Web服务器上为人们提供私有的Web站点。通常会把那些以斜杠和波浪号(/~)开始,后面跟着用户名的URI映射为此用户的私有文档根目录。私有docroot通常都是用户主目录下那个名为public html的目录,但也可将其配置为其他值。
目录列表
Web服务器可以接收对目录URL的请求,其路径可以解析为一个目录,而不是文件。我们可以对大多数Web服务器进行配置,使其在客户端请求目录URL时采取不同的动作。
- 返回一个错误。
- 不返回目录,返回一个特殊的默认“索引文件”。
- 扫描目录,返回一个包含目录内容的HTML页面。
大多数Web服务器都会去查找目录中一个名为index.html或index.htm的文件来代表此目录。如果用户请求的是一个目录的URL,而且这个目录中有一个名为index. html(或index.htm)的文件,服务器就会返回那个文件的内容。
在Apache Web服务器上,可以用配置指令DirectoryIndex来配置要作为默认目录文件使用的文件名集合。指令DirectoryIndex会按照优先顺序列出所有可以作为目录索引文件使用的文件名。下列配置行会使Apache在收到一个目录URL请求时,在目录中搜索命令中列出来的任意一个文件:
DirectoryIndex index.html index.htm home.html home.htm index.cgi
如果用户请求目录URI时,没有提供默认的索引文件,而且没有禁止使用目录索引,很多Web服务器都会自动返回一个HTML文件,此文件中会列出那个目录里的文件名,以及每个文件的大小和修改日期,还包括到每个文件的URI链接。使用这个文件列表可能会很方便,但有些好事者也可以通过它在Web服务器上找到一些通常找不到的东西。
可以通过以下Apache指令禁止自动生成目录索引文件:
Options -Indexes
动态内容资源的映射
Web服务器还可以将URI映射为动态资源——也就是说,映射到按需动态生成内容的程序上去。实际上,有一大类名为应用程序服务器的Web服务器会将Web服务器连接到复杂的后端应用程序上去。Web服务器要能够分辨出资源什么时候是动态的,动态内容生成程序位于何处,以及如何运行那个程序。大多数Web服务器都提供了一些基本的机制以识别和映射动态资源。
Apache允许用户将URI路径名组件映射为可执行文件目录。服务器收到一条带有可执行路径组件的对URI的请求时,会试着去执行相应服务器目录中的程序。例如,下列Apache配置指令就表明所有路径以/cgi-bin/开头的URI都应该执行在目录/usr/local/etc/httpd/cgi-programs/中找到的相应文件:
ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-programs/
Apache还允许用户用一个特殊的文件扩展名来标识可执行文件。通过这种方式就可以将可执行脚本放在任意目录中了。下面的Apache配置指令说明要执行所有以.cgi结尾的Web资源:
AddHandler cgi-script .cgi
CGI是早期出现的一种简单、流行的服务端应用程序执行接口。现代的应用程序服务器都有更强大更有效的服务端动态内容支持机制,包括微软的动态服务器页面(Active Server Page)和Java servlet。
服务器端包含项
很多Web服务器还提供了对服务器端包含项(SSI)的支持。如果某个资源被标识为存在服务器端包含项,服务器就会在将其发送给客户端之前对资源内容进行处理。
要对内容进行扫描,以查找(通常包含在特定HTML注释中的)特定的模板,这些模板可以是变量名,也可以是嵌入式脚本。可以用变量的值或可执行脚本的输出来取代特定的模板。这是创建动态内容的一种简便方式。
访问控制
Web服务器还可以为特定资源进行访问控制。有请求到达,要访问受控资源时,Web服务器可以根据客户端的IP地址进行访问控制,也可以要求输入密码来访问资源。
总结
Web服务器是资源服务器。它们负责发送预先创建好的内容,比如HTML页面或JPEG图片,以及运行在服务器上的资源生成程序所产生的动态内容。
在Web服务器将内容传送给客户端之前,要将请求报文中的URI映射为Web服务器上适当的内容或内容生成器,以识别出内容的源头。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)