图片到底放本地目录还是放对象存储,这事跟伪静态没那么大关系——伪静态储存图片本地目录还是对象存储这个纠结,十有八九是把两件不相干的事搅一块了:URL 长得像静态文件,不代表字节就是从本机磁盘直读出来的。rewrite 只是让 /uploads/2026/03/photo.jpg 这种地址看着顺眼、或者让 /img-123.html 也能指向一张图,服务器收到请求之后是把文件直接甩出去,还是转手交给 PHP 再去找图,这是两条完全不同的链路。链路先分清,选哪儿存才有讨论的意义,不然聊半天都在各说各的。

伪静态储存图片,本地目录还是对象存储,先把两条链路分开
一条叫直读链路:请求进来,nginx 还是 Apache 看后缀命中静态规则,直接从磁盘或者挂载点把文件读出来返回,中间不过脚本。另一条叫转发链路:rewrite 把所有请求往 index.php 收,图片也一起进去了,PHP 再判断权限、加水印、生成缩略图、统计下载量,最后才把图吐出来。第一种链路衡量的是磁盘 IO、inode 数量、出口带宽;第二种链路衡量的是 PHP 执行开销、内存、以及后端存储的响应速度。同一个小节里两个标准混着用,谁也说服不了谁。
还有个容易忽略的点:图片换域名之后,主站的伪静态规则如果没做排除,等于自己给自己加了一道转发。本来 /img/xxx.jpg 直读好好的,加了 img 子域或者 CDN 之后,请求绕回主站再走一次 rewrite,白白多出几百毫秒——这个不是理论,改版时我见过不止一次。
本地目录的好处,省事排第一
单机部署、图不算多的站,本地目录基本不用想太多。上传就在本机落盘,读的时候不经过公网,缩略图、水印、EXIF 这些活儿随手就能干。备份跟着整站打包走,迁移的时候 rsync 一把梭,路径不用改、域名不用换。麻烦的地方也摆在明面上:图片吃的是服务器自己的盘,攒到一定量之后磁盘容量、inode、备份体积都会变成负担,一次全量备份从几分钟变成半小时;多台机器要读同一份图,就得挂 NFS 或者别的共享存储,那玩意儿的稳定性,用过的都懂;换服务器搬图,永远是最容易出事的一步,尤其是路径写成绝对地址的那种站。
对象存储是另一种账,不是升级打怪
图片上量之后,对象存储值不值,看你从哪个角度算。它把图片从”服务器的一部分”变成”独立的一坨”:换服务器不用搬图,多机多地域都能读,挂 CDN 有个稳定的源站,权限、生命周期、版本这些也有现成的东西用。代价是每次读都得走网络,回源延迟比本地盘高一截,流量和请求都要计费——具体怎么算以服务商官方页面为准,别拿别人文章里的旧数字当标准。私有读的桶还得签名,签名有效期没设好,前台一片加载失败,这事故太常见了。
所以对象存储不是”更高级”,它更像给多机、多地域、大流量准备的方案。一个日访问几百 IP 的企业站,硬上对象存储,省下来的那点搬迁便利,抵不过每次回源多出来的延迟和排查成本。
规则不改,图片搬了也白搭
图片挪到对象存储,很多人只改了上传那一段代码,忘了 rewrite。最典型的写法是把所有请求统一往 index.php 导,顺手把 .jpg 也带进去了,结果每个图片请求都变成一次 PHP 执行,PHP 再拿 SDK 去对象存储拉流,层层转发。nginx 里给静态后缀留个例外就完事,大意是这样:location ~* \.(jpg|jpeg|png|gif|webp|svg)$ { try_files $uri =404; },别让它进 rewrite。图片挂到独立域名的话,直接在 img 那个域名上做代理或者跳转,别让请求绕回主站。
Apache 那边同理,RewriteCond 里加排除条件,%{REQUEST_URI} 不以 /uploads/ 开头才走 rewrite,这类排除宁可多写两行,也别图省事全塞进 index.php。另外数据库里的图片路径尽量存相对路径,别存带域名的绝对地址,以后换存储只改一个配置项,比跑一遍全库替换的 SQL 靠谱得多——那种替换,漏一条就是一张裂图,还不好查。
混着用,多数站最后都这样
老图留本地,新图进对象存储;或者原图进对象存储,缩略图在本地缓存一层。这不是审美问题,是迁移成本问题。分界线可以按时间切,按年份目录分;也可以按用途切,用户上传的走对象存储,模板素材、图标这些留本地。关键只有一条:同一张图别有两个”权威副本”,不然哪天真出问题,你都不知道该信哪个版本,同步脚本写起来也容易变成迷宫。
几个容易踩的坑,说多了都是泪
备份别搞混。对象存储不算备份,误删、覆盖、欠费停服一样会没;本地目录也不算备份,磁盘挂了照样完。两边都放着,才叫有一份。
防盗链和权限两边都要配。本地靠 nginx 的 referer 校验,对象存储靠桶策略加签名 URL,光配一头,另一边就是敞开的。还有迁移前先算一下出口带宽,图片从对象存储回源到自己的服务器,这部分流量是实打实要花的,费率以服务商页面为准,别看个大概就拍板。
给个简单的判断:单机、图不多、也没打算上 CDN,本地目录挺好,别为想象中的规模提前上复杂架构;图片越过一定量、要多机读写、或者已经挂了 CDN,那就趁早搬对象存储,但先把 rewrite 排除规则、URL 结构、备份方案这三件事列进迁移清单。拿不准就先混着跑一阵,看回源和加载的真实表现,再决定要不要全量搬——凭感觉拍板,返工的成本比试错高得多。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!