浏览器
- 用户在浏览器中输入 URL 网址
- 浏览器解析用户输入的 URL 地址 => 域名 + 端口
- 浏览器会先检查本地缓存中有没有这个域名 => IP
- 如果有, 则直接使用IP进行访问
- 如果没有, 则浏览器发起一个 DNS 系统调用(操作系统进行查找)
- 操作系统检查自己的缓存里有没有这个域名
- 没有的话找系统的 hosts 文件中有没有这个域名
- 如果都没有找到, 会对 DNS 服务器发起一个系统调用
- 浏览器通过一个本机的随机端口建立一个与服务器指定端口(80)之间的连接通道
- 浏览器会将客户端的一些信息打上一个“包”, 将这个“包”通过这个连接通道发送到服务端
- 打开服务端返回过来的“包”, 找到 Content-type, 决定如何处理响应的内容
- 如果是 HTML 则渲染到界面上
- “包”的概念是请求报文
注: 谷歌使用 chrome://net-intermals 查看浏览器缓存
服务器
- 打开客户端提交过来的“包”, 拿到“包”里面的请求路径
- 根据请求的路径对应文件扩展名找到文件的类型(MIME Type)
- 判断文件类型是否为静态文件
- 如果是静态文件, 则直接读取这个文件的内容
- 如果不是静态文件, 则交给“外包公司”执行代码
- 服务端拿到执行的结果, 把要发给客户端的数据打上一个“包”
- 将这个“包”再通过之前的连接通道发给客户端
请求报文
响应报文
可以利用 PHP 对响应头进行一些配置
<?php
// php 中 header 函数专门用于设置响应头, 不能设置两个相同的, 会被覆盖
// 设置响应类型
header('Content-type: text/css');
// 设置跳转(重定向)页面
header('location: xxx.php');
// 让文件下载
header('Content-type: application/octet-stream');
// 设置默认下载文件名
header('Content-Disposition: attachment; filename=demo.txt');
// 设置cookie
header('Set-Cookie: key=value');
?>