app.staticweb 和 app.handledir 的区别在于:staticweb 语义清晰、自动处理 mime/缓存/安全防护;handledir 更底层,支持 embed.fs 或自定义逻辑,但需手动配置缓存。

直接用 app.StaticWeb 或 app.HandleDir,别写自定义路由转发——否则无法利用内核 sendfile,大文件并发会吃光 CPU。
StaticWeb 和 HandleDir 的区别在哪
app.StaticWeb 是最常用、语义最清晰的方式,它把本地目录映射到 URL 前缀,自动处理 MIME 类型、缓存头、目录遍历防护;app.HandleDir 更底层,适合需要嵌入式文件系统(如 embed.FS)或自定义响应逻辑的场景。
-
app.StaticWeb("/static", "./public"):访问/static/logo.png会返回./public/logo.png -
app.HandleDir("/assets", iris.Dir("./dist")):等价于StaticWeb,但不自动加Cache-Control,需手动配置app.StaticCacheDuration - 两者都默认禁用目录列表(即访问
/static/返回 404),如需开启,得额外调用app.HandleDir("/docs", iris.Dir("./docs"), iris.DirOptions{ShowList: true})
路径参数容易错的三个点
URL 路径前缀(第一个参数)必须以 / 开头,本地路径(第二个参数)必须是相对或绝对文件系统路径,且运行时进程要有读权限。
- 错误写法:
app.StaticWeb("static", "./static")→ URL 前缀缺/,请求/static/x.js匹配失败 - 错误写法:
app.StaticWeb("/static", "static")→ 第二个参数不是合法路径,启动时报open static: no such file or directory - 错误写法:
app.StaticWeb("/static/", "./static")→ URL 前缀末尾多斜杠,/static/test.css可能 404(Iris 不做自动归一化)
生产环境必须关掉调试模式并设缓存
开发时默认开启 app.IsDevelopment,会禁用静态资源缓存;生产部署若不显式关闭,浏览器每次都会发 If-None-Match 请求,白白增加 I/O 和协商开销。
- 启动前加:
app.Run(iris.Addr(":8080"), iris.WithoutVersionHeader, iris.WithoutServerError(iris.ErrLog)) - 设缓存时长:
app.StaticCacheDuration = 24 * time.Hour(影响所有StaticWeb和HandleDir) - 注意:
StaticCacheDuration对.html文件也生效,若 HTML 是动态生成的,别用StaticWeb托管,改用View渲染
真正麻烦的是路径权限和构建产物位置——go build 后二进制运行时的当前工作目录不一定是项目根目录,./static 很可能找不到。要么用绝对路径(如 /opt/myapp/static),要么在启动时用 os.Chdir 切过去,否则上线第一分钟就 404。











