app.Static()要求URL前缀与文件系统路径严格对应,如app.Static("/css", "./client/css")表示所有以/css/开头的请求映射到./client/css下对应文件;HTML中必须用绝对路径<link href="/css/main.css">,且推荐用os.Executable()构建绝对路径,同时Nginx需用alias精确配置透传。

app.Static() 的路径映射逻辑必须对齐
调用 app.Static("/css", "./client/css") 的真实含义是:所有以 /css/ 开头的请求(比如浏览器访问 /css/main.css),Iris 会尝试读取本地文件 ./client/css/main.css。这要求 URL 前缀和文件系统路径严格对应,不能靠“猜”或“就近匹配”。
常见错误现象:
- HTML 中写
<link href="css/main.css">—— 这是相对路径请求,根本不会走到app.Static()路由里 - 写成
<link href="./css/main.css">—— 同样是相对路径,跟服务器配置无关 - 正确写法只能是
<link href="/css/main.css">,开头带斜杠,才匹配/css/前缀
用 os.Executable() 构建绝对路径,避免 ./ 相对路径失效
Go 二进制运行时的工作目录不固定,./client/css 在开发时可能正常,部署后常因启动位置不同而找不到文件。推荐基于可执行文件位置推导根目录:
ex, err := os.Executable()
if err != nil {
panic(err)
}
dir := filepath.Dir(filepath.Dir(ex)) // 假设 assets 在可执行文件同级的 client/ 下
assetsDir := filepath.Join(dir, "client", "css")
app.Static("/css", assetsDir)
关键点:
-
os.Executable()返回当前二进制文件的绝对路径,稳定可靠 - 不要依赖
os.Getwd(),它返回的是进程启动时所在目录,不可控 - 如果静态资源放在
assets/下且想通过/static/访问,就该写app.Static("/static", assetsDir),而不是硬套/css前缀
别混用 app.HandleDir 和 app.StaticWeb,它们行为不同
app.HandleDir("/public", "./public/") 是旧式写法,底层直接挂载 http.FileServer,不自动剥离前缀,容易出 404;而 app.StaticWeb("/static", "./public") 内部已做路径剥离,更贴近直觉。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
例如请求 /static/logo.png:
-
app.HandleDir会去查./public/static/logo.png(错误) -
app.StaticWeb会查./public/logo.png(正确) -
app.Static行为介于两者之间,但需手动确保路径结构一致
如果你的文件实际在 ./public/logo.png,又想用 /static/ 访问,优先选 app.StaticWeb。
Nginx 透传时必须同步调整 alias 配置
哪怕 Iris 侧路径全对,Nginx 配置错一个字符也会导致 404。典型错误是 Nginx 的 location /static/ 没配 alias,或者 alias 少了末尾斜杠:
# ❌ 错误:root 会拼接完整路径,变成 /var/www/static/static/logo.png
location /static/ {
root /var/www;
}
<h1>✅ 正确:alias 显式指定映射目标,末尾斜杠不能少</h1><p>location /static/ {
alias /var/www/public/;
}
核心原则:URL 路径、Iris 文件系统路径、Nginx alias 三者必须完全对齐。少一个斜杠、多一层目录、大小写不一致,都会让 /css/style.css 瞬间 404。


















