nginx实现网页缓存防篡改
字数 1279 2025-08-15 21:33:32
Nginx实现网页缓存防篡改技术详解
一、概述
网页缓存防篡改是一种通过Nginx缓存机制保护敏感页面的技术,即使源站页面内容被恶意篡改,WAF也会向访问者返回预先缓存好的正确页面内容。这种技术主要适用于需要高度保护的静态页面或更新频率较低的动态页面。
二、核心原理
- 缓存机制:将用户配置的URL页面缓存到OpenResty
- 请求处理:用户请求时直接从Nginx缓存获取页面
- 同步机制:被保护页面更新时需手动触发缓存更新
- 失效机制:缓存过期与清除的优先级:
- inactive配置项(最高优先级)
- 源服务器设置的Expires
- 源服务器设置的Max-Age
- proxy_cache_valid配置项(最低优先级)
三、配置步骤
1. 基本配置(http块内)
proxy_buffering on;
proxy_buffer_size 16k;
# 设置Web缓存区
proxy_cache_path /home/waf/openresty/proxy_cache_path levels=1:2
keys_zone=cache_one:500m
inactive=365d
max_size=30g;
参数说明:
/home/waf/openresty/proxy_cache_path:缓存文件存储路径levels=1:2:缓存目录层级结构keys_zone=cache_one:500m:定义共享内存区域名称为cache_one,大小为500MBinactive=365d:365天内未被访问的缓存自动清除max_size=30g:硬盘缓存空间最大为30GB
2. 缓存清除接口配置
location ~ /purge(/.*) {
allow 127.0.0.1;
allow 10.10.10.10;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
说明:
- 只允许特定IP(127.0.0.1和10.10.10.10)执行缓存清除操作
- 使用
proxy_cache_purge指令清除指定缓存
3. 图片缓存配置示例
location ~* \.(jpg|jpeg|png)$ {
proxy_cache cache_one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 365d;
proxy_cache_revalidate on;
proxy_cache_lock on;
proxy_ignore_headers Set-Cookie Cache-Control;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_no_cache $http_range $http_if_range;
add_header X-Cache $upstream_cache_status;
proxy_pass http://rp_10_11_12_10_80cert_cn;
session_sticky_hide_cookie upstream=rp_10_12_52_89_80cert_placuna_cn;
}
4. PHP页面缓存配置示例
location /test/index.php {
proxy_cache cache_one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 365d;
proxy_cache_revalidate on;
proxy_cache_lock on;
proxy_ignore_headers Set-Cookie Cache-Control;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_no_cache $http_range $http_if_range;
add_header X-Cache $upstream_cache_status;
proxy_pass http://rp_10_11_12_10_80cert_cn;
session_sticky_hide_cookie upstream=http://rp_10_11_12_10_80cert_cn;
}
四、关键配置项详解
- proxy_cache:指定使用的缓存区域
- proxy_cache_key:定义缓存键的组成方式(通常使用域名+URI+参数)
- proxy_cache_valid:定义不同HTTP状态码的缓存有效期
- proxy_cache_revalidate:启用缓存重新验证
- proxy_cache_lock:启用缓存锁,防止多个请求同时更新缓存
- proxy_ignore_headers:忽略特定的响应头(如Set-Cookie和Cache-Control)
- add_header X-Cache:在响应中添加缓存状态头,便于调试
五、缓存更新策略
- 自动更新:基于inactive配置和源服务器头信息
- 手动更新:通过/purge接口强制清除并重新缓存
- 更新注意事项:
- 确保更新操作来自可信IP
- 更新后验证缓存是否生效
- 对于重要页面,建议设置较长的缓存时间(如365天)
六、最佳实践
-
安全建议:
- 严格限制/purge接口的访问权限
- 定期检查缓存目录权限
- 监控缓存命中率
-
性能优化:
- 根据业务特点设置合理的缓存时间(10-30天不等)
- 对大文件(如图片)单独配置缓存策略
- 监控缓存区内存和磁盘使用情况
-
维护建议:
- 建立页面更新与缓存更新的联动机制
- 记录缓存操作日志
- 定期检查缓存内容与源站一致性