Http Cache最基本的一些东西

本文详细解析了HTTP缓存机制的四个核心部分:Cache-Control、Last-Modified与If-Modified-Since、Etag及Expires。介绍了这些机制如何分别应用于浏览器端和服务器端,以及如何通过配置实现高效缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Http的Cache机制总共有4个组成部分:

Cache-Control: max-age=N(seconds)
Last-Modified: Date, If-Modified-Since: Date
Etag: "xxxx"
Expires: Date

它们都存在于Request或者Response的Header中

按照作用来分可以分为浏览器端和服务器端。

浏览器端:
注:刷新都会无视浏览器端的Cache

Cache-Control: max-age=N(seconds)

Expires: Date

Cache-Control的max-age优先级高于Expires(至少对于Apache是这样的),即如果定义了Cache-Control: max-age,则完全不需要加上Expries,因为根本没用。例如:你在浏览A页面时,A页面加载了一个名为B的JS文件,该JS文件的Response Header中有Cache-Control: max-age=60,如果你再访问任何其他用到B文件的页面时,60秒内浏览器完全不会向服务器发送请求,直接使用Cache中的内容。60秒以后,Cache失效。想每一次都发送请求,则max-age设为0

Cache-Control在Apache中的设置为
Header set Cache-Control "max-age: 60"

Expires是相同的功能,不过参数是个绝对的日期,不是一个相对的值

Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT"
如果使用mod_expires.so也可以根据相对值计算出绝对值

服务器端:

Last-Modified: Date, If-Modified-Since: Date
ETag

继续刚才上面的例子,当max-age超过以后,浏览器会向服务器端发送请求。在B文件上一次的Response Header中会带有Last-Modified: Date,这时新请求的Header中会有If-Modified-Since: Date。服务器端在收到请求后,将B的最后修改日期和Header中的日期进行对比,如果相同则说明B没有被修改过,返回304 Not Modified,否则返回200和B的内容

如果只设置了Last-Modified而没有设置Cache-Control,则不同浏览器的表现会不同: 1. IE中也许有个默认的非常大的max-age或者压根就是无限,服务器端修改的内容,IE中不会反映出来 2. FF和Webkit请求的比较随机,貌似刚刚变更后请求的会比较频繁,然后逐渐放大请求的间隔,但是服务器端修改了内容,我还没试出来浏览器不更新的...

Etag和Last-Modified也是类似的,只不过检查的不是最后修改的时间,而是被请求内容的Hash

Etag和Last-Modified在Apache中默认都是打开的,关闭的方法是

Header unset Etag
Header unset Last-Modified

综上所述:

对于静态的内容:如果引用静态文件时可以根据文件的修改时间生成动态的文件名,并rewrite到实际的文件,则可以设置max-age: 5184000(2个月,其实可以更长,比如1年),这样的话可以省去大量的http请求。否则的话,只能设置Last-Modified(或者Etag,Etag估计比较耗cpu) + max-age: 0,则每次都会发送请求,并且大多数会得到304 Not Modified

对于变更不频繁的动态内容:可以在response中加上Cache-Control: max-age=0 + Last-Modified(ETag),可以让很多200的请求变成304的请求
<think>好的,用户现在遇到了Ubuntu系统根目录爆满导致无法启动的问题,之前我给出了使用Live USB进入救援模式的解决方案。现在用户回复说不想用其他东西,想直接用恢复模式解决。我需要调整之前的建议,专注于恢复模式的操作步骤。 首先,我需要确认用户所说的“恢复模式”指的是Ubuntu自带的Recovery Mode。在Recovery Mode下,用户可以通过root shell来清理磁盘空间。用户可能因为手头没有Live USB或者不想制作启动盘,所以希望直接利用系统自带的恢复选项。 接下来,我需要考虑用户可能已经尝试过正常启动,但系统无法进入图形界面,因此才会选择恢复模式。恢复模式提供了几个选项,比如clean(清理空间)、dpkg(修复包)、fsck(检查文件系统)、root(进入root shell)等。但用户的情况是根目录已满,所以重点应放在如何通过root shell进行清理。 用户可能不熟悉命令行操作,需要步骤尽可能详细且明确。例如,如何进入恢复模式,选择哪个选项,具体执行哪些命令来清理空间。同时,需要提醒用户谨慎操作,避免误删系统关键文件。 在恢复模式下,用户可能需要以读写模式挂载根目录,因为默认可能是只读的。所以步骤中需要包括remount rw的操作。然后,使用du或ncdu等工具分析大文件,删除旧内核、日志文件、缓存等。 需要注意的是,恢复模式下的工具可能有限,比如ncdu可能未预装,因此可能需要使用基本的du命令。此外,删除旧内核时,要确保不删除当前正在使用的内核,否则可能导致系统无法启动。 另外,用户可能需要指导如何安全删除文件,比如如何确定哪些日志文件可以删除,避免影响系统服务。例如,删除旧的日志文件(如*.log.*),而不是当前正在使用的日志。 后,清理完成后,需要提醒用户重启系统,并建议后续的预防措施,比如定期清理和监控磁盘空间。如果恢复模式下清理后仍无法启动,可能需要进一步的操作,比如检查文件系统错误或考虑扩容分区。 总结来说,回复需要步骤清晰,避免使用用户可能没有的工具,确保所有操作在恢复模式下可行,并且给出明确的命令示例和注意事项,帮助用户安全有效地解决问题。如果</think>不想使用Live USB,可以尝试通过Ubuntu自带的 **恢复模式(Recovery Mode)** 直接清理根目录空间。以下是具体步骤: --- ### **一、进入恢复模式** 1. **开机时按住 `Shift` 键**(如果是UEFI启动,可能需要按 `Esc` 键),进入GRUB菜单。 2. 选择 **`Advanced options for Ubuntu`**,然后选择带有 **`(recovery mode)`** 的选项(通常是第二行)。 3. 进入恢复模式菜单后,选择 **`root`**(进入root shell的终端)。 --- ### **二、挂载根目录为可读写** 默认情况下,恢复模式的根目录是只读的,需手动挂载为可读写: ```bash mount -o remount,rw / # 重新挂载根目录为可读写 ``` --- ### **三、清理根目录空间** #### 1. **快速释放空间** 先删除一些明显的大文件(如旧内核、日志、缓存): ```bash # 删除旧内核(保留新的1~2个) dpkg --list | grep linux-image # 查看已安装的内核 apt purge linux-image-5.4.0-XX-generic # 替换XX为旧版本号 # 清理APT缓存 apt clean rm -rf /var/cache/apt/archives/*.deb # 清理日志文件(保留新的) rm /var/log/*.log.* # 删除轮转后的旧日志 truncate -s 0 /var/log/syslog # 清空系统日志(不影响正在运行的服务) ``` #### 2. **检查其他大文件** ```bash # 查看根目录占用前10的目录 du -h --max-depth=1 / 2>/dev/null | sort -hr | head -n 10 # 手动检查常见大文件目录 rm -rf /tmp/* # 清理临时文件 rm -rf ~/.cache/* # 清理用户缓存(可能需要切到用户目录) ``` --- ### **四、退出并重启** 1. 输入 `exit` 退出root shell。 2. 返回恢复菜单后,选择 **`resume`** 继续正常启动。 --- ### **五、注意事项** 1. **谨慎删除文件**:避免误删系统关键文件(如`/usr`、`/lib`等)。 2. **若清理后仍无法启动**: - 在恢复模式下尝试 **`fsck`**(检查文件系统错误)。 - 选择 **`dpkg`** 修复损坏的软件包。 3. **预防措施**: ```bash apt autoremove # 定期删除无用依赖 journalctl --vacuum-size=100M # 限制系统日志大小 ``` --- 通过恢复模式清理后,多数情况下系统可恢复正常启动。如果问题依旧,可能需要更深入的排查(如扩容分区或重装系统)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值