
当使用 Martini 的命名参数路由(如 /edit/:id)时,若 HTML 中使用相对路径引用静态文件(如 assets/css/bootstrap.min.css),浏览器会基于当前 URL 路径解析,导致 404;应统一改用以 / 开头的绝对路径(即根路径)确保静态资源正确加载。
当使用 martini 的命名参数路由(如 `/edit/:id`)时,若 html 中使用相对路径引用静态文件(如 `assets/css/bootstrap.min.css`),浏览器会基于当前 url 路径解析,导致 404;应统一改用以 `/` 开头的绝对路径(即根路径)确保静态资源正确加载。
在 Martini 应用中,静态文件服务(如 martini.Static("assets", opts))默认将 assets 目录映射到 HTTP 根路径下的 /assets/ —— 这意味着只要请求路径以 /assets/ 开头(例如 /assets/css/bootstrap.min.css),Martini 就能正确返回对应文件。
但问题根源在于前端 HTML 中使用了相对路径:
<link rel="stylesheet" type="text/css" href="assets/css/bootstrap.min.css"><script src="assets/js/bootstrap.min.js"></script>
当用户访问 http://localhost:3000/edit/123 时,浏览器会将上述 href 和 src 解析为:
- http://localhost:3000/edit/assets/css/bootstrap.min.css
- http://localhost:3000/edit/assets/js/bootstrap.min.js
显然,这些路径并不存在(Martini 并未注册 /edit/assets/ 路由),因此静态资源加载失败。
✅ 正确做法是使用根相对路径(root-relative URL):在路径前加 /,使其始终从站点根目录解析:
<link rel="stylesheet" type="text/css" href="/assets/css/bootstrap.min.css"><script type="text/javascript" src="/assets/js/bootstrap.min.js"></script>
这样,无论当前页面是 /edit/123、/show/456 还是 /admin/dashboard,浏览器都会统一请求:
- http://localhost:3000/assets/css/bootstrap.min.css
- http://localhost:3000/assets/js/bootstrap.min.js
而这正是 Martini 静态中间件所监听和响应的路径。
⚠️ 注意事项:
- 不要使用 ./assets/... 或 ../assets/... —— 它们仍是相对路径,易受嵌套深度影响;
- 确保 martini.Static 的 Prefix 设置与 HTML 中的路径前缀一致(本例中 Prefix: "assets" 对应 /assets/,而非 /static/assets/);
- 若后续需支持子路径部署(如 /myapp/assets/),建议通过模板变量或配置注入基础路径(如 {{.StaticBase}}/css/app.css),而非硬编码 /assets/。
总结:Martini 的静态文件服务本身无缺陷,问题本质是前端路径解析逻辑的理解偏差。“/” 开头 = 从域名根开始,这是 Web 开发中跨路由复用静态资源的通用且可靠实践。










