iris静态资源404主因是路径错位:url前缀、文件系统路径、nginx透传路径三者必须严格一致;正确做法是用os.executable()构建绝对路径并配alias代理,同时设置staticcacheduration。

Iris 静态资源 404 的主因不是配置写错了,而是路径没对上——文件系统路径、URL 路径、Nginx 透传路径三者只要一个错位,/css/style.css 就必然 404。
app.Static() 的 URL 前缀和本地目录必须严格对应
调用 app.Static("/css", "./client/css") 的含义是:所有以 /css/ 开头的请求(如浏览器访问 /css/main.css),都去读取本地 ./client/css/main.css 文件。
- HTML 中引用必须匹配 URL 前缀:
<link href="/css/main.css">才能命中,写成css/main.css或./css/main.css会直接走相对路径请求,跟app.Static()无关 - 本地路径推荐用绝对路径,否则
./client/css会相对于进程当前工作目录解析——而 Go 二进制运行时的工作目录不一定是项目根目录 - 如果静态资源在
assets/下,且想通过/static/访问,就该写app.Static("/static", assetsDir),而不是硬套/css
用 os.Executable() 构建可靠绝对路径
相对路径 "./client/css" 在开发时可能正常,但部署为二进制后常因启动位置不同而失效。最稳妥的方式是基于可执行文件位置推导项目根目录:
import (
"os"
"path/filepath"
)
<p>exePath, _ := os.Executable()
rootDir := filepath.Dir(exePath) // /opt/myapp/myapp → /opt/myapp
cssDir := filepath.Join(rootDir, "client", "css")
app.Static("/css", cssDir)
</p>
- 这能确保无论你在哪执行
./myapp,cssDir指向的都是二进制同级的client/css - 若资源目录不在二进制同级(比如放在
/var/www/myapp/static),就直接写死绝对路径:"/var/www/myapp/static" - 别依赖
os.Getwd(),它返回的是 shell 当前目录,不可控
Nginx 反向代理下必须用 alias,不能用 root
如果你用 Nginx 做反代(比如把 https://example.com 转发到 localhost:8080),而 Iris 本身监听 /static/,那么 Nginx 配置极易出错:
-
root /var/www;+location /static/ { }→ 实际找的是/var/www/static/xxx,多了一层static - 正确做法是用
alias把路径完全替换:location /static/ { alias /var/www/myapp/static/; }→ 请求/static/logo.png直接映射到/var/www/myapp/static/logo.png - 注意
alias末尾的斜杠:写成alias /var/www/myapp/static;(无尾斜杠)会导致路径拼接错误
缓存与性能:别忽略 StaticCacheDuration
Iris 默认不加缓存头,每次请求都会走磁盘读取。生产环境务必设置缓存时长:
app.StaticCacheDuration = 24 * time.Hour
app.Static("/js", jsDir)
app.Static("/img", imgDir)
- 这个设置影响所有后续
app.Static()注册的目录,建议在注册静态路由前统一设好 - 若需对某类资源单独控制(如 HTML 不缓存、JS 缓存一年),就得弃用
app.Static(),改用app.Handle("GET", "/js/{file:path}", ...)手动处理 - 配合 Nginx 的
expires指令可形成双层缓存,但要注意两者不要冲突(比如 Iris 设了 1h,Nginx 又设了 1y,最终以响应头为准)
真正卡住人的从来不是怎么写那行 app.Static(),而是搞不清当前请求的 URL 被谁解析、文件到底从哪读、Nginx 到底改写了没有——建议先用 curl -v http://localhost:8080/css/style.css 绕过浏览器和 Nginx 直连 Iris,确认服务端是否真能返回,再一层层往上查。











