前端发布静态资源自动增加版本号

前端服务发布,一些css,js文件的响应头会进行强缓存的设置,比如响应头:Cache-Control, Etag, Last-Modified等。结果就是浏览器会缓存这些静态资源文件,如果前端服务迭代发布了,即使静态资源进行了更新,但是你的浏览器可能使用强缓存,访问缓存在本地的旧的静态资源文件,造成一系列的问题。本文基于openresty解决该问题。

访问流程:

①浏览器地址栏输入: http://10.1.1.3:80/abc/dashboard/@last/index.html

②nginx将uri中的/abc/dashboard/@last/index.html 替换为:/abc/dashboard/"发布版本号"/index.html,替换逻辑来源于目录的扩展属性

③代理到前端服务地址,此时uri已经带上"发布版本号"

**前提是:**发布时需要设置指定目录的扩展属性为:版本号(一般发布平台会自动生成发布版本号)。下面提供一些设置方式

复制代码
在发布时执行以下命令,$(Build.BuildNumber)为发布版本号,
/apps/abc_new为服务指定目录,即设置扩展属性的文件目录

setfattr -n user.last_version -v $(Build.BuildNumber) /apps/abc_new



或者执行以下shell脚本,获取指定目录下修改时间最新的文件夹
(静态资源的目录可能是以发布的版本号命名的文件夹)

#!/bin/bash
cd /apps/abc_new
latest_folder=$(ls -td -- */ | head -n 1 | cut -d/ -f1)
setfattr -n user.last_version -v $latest_folder /apps/abc_new
1.nginx配置
复制代码
location /abc/dashboard {
	access_by_lua_block {
		local last_version = require "resty.last_version"
		last_version.replace_uri("/apps/abc_new")
	}
    #反向代理到前端服务
	proxy_pass http://abc_dashboard;
	proxy_redirect    off;
	proxy_set_header  Host $host;
	proxy_set_header  X-real-ip $remote_addr;
	proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

}

#前端服务,docker容器部署
upstream abc_dashboard {
    server 10.1.1.3:8081;
    server 10.1.1.4:8081;
    check interval=3000 rise=2 fall=5 timeout=2000 type=http;
    check_http_send "HEAD /  HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx http_4xx;
}
2.lua脚本(替换uri中的"@last"为发布版本号)
复制代码
local shell = require "resty.shell"

local _M = {}

--获取指定目录的扩展属性,即版本号
local function get_last_version(parent_path)
        local ok, stdout, stderr, reason, status  = shell.run("getfattr -n user.last_version  --absolute-names " .. parent_path .." --only-values")
        if ok then
                return stdout
        else
                return "404"
        end
end

--将uri中的@last替换为版本号
function _M.replace_uri(parent_path)
        local req_uri = ngx.var.request_uri
        local last_start ,last_end = ngx.re.find(req_uri, '/@last/', 'jo')
        if last_start and last_end then
                local last_version = get_last_version(parent_path)
                local new_url = string.sub(req_uri, 1, last_start) .. last_version .. string.sub(req_uri, last_end)
                ngx.log(ngx.ERR, "new_url = " .. new_url)
                ngx.req.set_uri(new_url)
                return new_url
        end
end

return _M
相关推荐
犹豫的果冻布丁17 小时前
从零给 DeepSeek Harness 写一个壁纸皮肤插件(已开源)
前端·后端
漏刻有时17 小时前
数据可视化Three.js 3D 地图实战:单文件原生实现省域区县拉伸建模
前端
会说话的番茄18 小时前
AI 满嘴跑火车怎么办?给它配个"小抄"
前端·aigc
计算机魔术师18 小时前
AI 权力集中辩论实录:从「token 工厂」到「唯一幸存者」
前端
eric-sjq18 小时前
WanlyFrontend 中文声明式前端语言完全指南:让 0.6B 模型写出漂亮网页
前端
Full Stack Developme18 小时前
跨站请求伪造 (CSRF) 是什么 设计及工作原理
前端·okhttp·csrf
MoSTChillax18 小时前
UI规范设计:从视觉到交互的全面指南
前端·ui·产品经理·设计规范·vibecoding
雪碧聊技术18 小时前
Vue + Element Plus 实现文本溢出显示省略号及悬浮提示
前端·javascript·css·vue.js·文本溢出省略
eric-sjq18 小时前
0.6B 前端生成模型本地部署实战:消费级显卡跑通 WanlyFrontend 全流程
前端·本地部署
小妖66619 小时前
设置了 box-sizing: border-box; 不管用,下边框还是被挤压没了
前端·css·html