nginx按需传输静态资源的核心是依据请求特征动态响应:按文件类型差异化处理压缩与sendfile;依客户端能力启用webp、移动端适配;依缓存状态减少i/o;依来源合法性实现防盗链与鉴权。

配置 Nginx 实现静态资源的按需传输处理,核心是让服务器只在真正需要时读取、压缩、缓存或转发文件,避免无意义的 I/O、网络开销和重复计算。它不是“全量加载”,而是根据请求特征(如文件类型、客户端能力、缓存状态、Referer 等)动态决定如何响应。
按文件类型启用高效传输
对图片、字体、音视频等二进制资源,禁用压缩;对 HTML/CSS/JS 等文本资源,启用 Gzip 或 Brotli 压缩。关键在于精准匹配后差异化处理:
- 用 location ~* \.(js|css|html|json|xml|txt)$ 匹配文本类资源,开启
gzip on并设置gzip_types明确类型 - 用 location ~* \.(jpg|jpeg|png|gif|webp|woff2|ttf)$ 匹配二进制资源,关闭 gzip(默认不压),但必须开启
sendfile on和tcp_nopush on - 对 SVG 文件要特别注意:它本质是 XML 文本,建议加入
gzip_types image/svg+xml,并确保 MIME 类型正确(types { image/svg+xml svg svgz; })
按客户端能力做条件响应
Nginx 可根据请求头判断是否支持压缩、是否接受 WebP、是否为移动设备等,实现真正“按需”:
- 启用
gzip_vary on,让代理和浏览器知道响应会因Accept-Encoding不同而变化 - 配合
map指令识别客户端:map $http_accept $webp_suffix {<br> ~*webp ".webp";<br> default ""; }
再在 location 中用try_files $uri$webp_suffix $uri =404尝试返回 WebP 版本 - 用
$http_user_agent判断移动端,可重写路径或返回精简版资源(如if ($http_user_agent ~* "(Mobile|Android|iPhone)") { rewrite ^/static/(.*)$ /static/mobile/$1 break; })
按缓存状态控制读取行为
避免每次请求都触发磁盘 I/O,Nginx 可基于缓存有效性决定是否读文件、是否校验、是否回源:
- 启用
open_file_cache缓存文件元数据(存在性、大小、修改时间),减少 stat() 系统调用 - 配合
open_file_cache_valid和open_file_cache_min_uses,只对高频访问文件长期缓存其属性 - 使用
expires+add_header ETag ""组合:强缓存期间跳过文件读取;缓存过期后靠 ETag 触发304 Not Modified,仍不读内容体 - 对版本化资源(如
/v2.3.1/app.js),用location ~ ^/v\d+\.\d+\.\d+/(.*)$ { alias /var/www/static/$1; }直接映射,无需正则回溯或 try_files 跳转
按来源合法性限制传输
不是所有请求都该获得资源——防盗链、权限校验、灰度分流都是“按需”的一部分:
- 用
valid_referers配合if ($invalid_referer)拦截盗链图片,返回 403 或占位图 - 对敏感静态资源(如后台 JS 配置、内部文档),用
auth_request指令接入鉴权服务,只放行已认证请求 - 结合
geo或map指令区分地区或用户群,将不同请求导向不同 root 目录或 CDN 域名,例如:map $geoip_country_code $static_host {<br> CN "cdn-cn.example.com";<br> US "cdn-us.example.com";<br> default "cdn-global.example.com"; }
然后用add_header X-Static-Host $static_host或重定向引导











