
在 Martini 中使用命名参数路由(如 /edit/:id)时,HTML 中的相对路径引用(如 assets/css/...)会被浏览器解析为相对于当前 URL 路径,导致静态文件 404;正确做法是统一使用以 / 开头的根路径(如 /assets/css/...),确保静态资源始终从站点根目录加载。
在 martini 中使用命名参数路由(如 `/edit/:id`)时,html 中的相对路径引用(如 `assets/css/...`)会被浏览器解析为相对于当前 url 路径,导致静态文件 404;正确做法是统一使用以 `/` 开头的根路径(如 `/assets/css/...`),确保静态资源始终从站点根目录加载。
Martini 的静态文件中间件(martini.Static)默认将 assets 目录映射为根路径下的 /assets 端点,但前提是前端请求的 URL 必须显式以 /assets 开头。问题根源在于 HTML 中使用了协议相对路径或路径相对链接(例如 assets/css/bootstrap.min.css),而非根相对路径(即以 / 开头)。当用户访问 http://localhost:3000/edit/123 时,浏览器会将 assets/css/bootstrap.min.css 解析为 http://localhost:3000/edit/assets/css/bootstrap.min.css——该路径并不存在,因此返回 404。
✅ 正确写法:在所有静态资源引用前添加前导斜杠 /,强制其从域名根路径解析:
<!-- ✅ 正确:根路径引用,与当前路由无关 --> <link rel="stylesheet" type="text/css" href="/assets/css/bootstrap.min.css"><script type="text/javascript" src="/assets/js/bootstrap.min.js"></script>
⚠️ 注意事项:
- 不要使用 ./assets/... 或 assets/...(相对路径);
- 也不要使用 //example.com/assets/...(协议相对 URL),除非你明确需要跨域或协议切换;
- Martini 的 Static 中间件默认已启用根路径匹配,无需额外配置路由前缀(Prefix 字段在新版 Martini 中已弃用,建议直接移除);
- 若项目部署在子路径(如 /myapp/),则需配合反向代理重写或修改 StaticOptions.Prefix 并在 HTML 中同步调整为 /myapp/assets/... —— 但本例为根部署,故 /assets/... 即可。
? 小技巧:为提升可维护性,可在模板中定义静态资源基础路径变量(如 {{.StaticRoot}}/css/...),便于后续统一调整。不过对于简单应用,直接使用 /assets/ 是最简洁、可靠的选择。










