Caddy 部署前端的坑

date
Jan 16, 2023
slug
caddy-deploy-fe
status
Published
tags
Caddy
summary
将前端项目 build 后产生的静态文件放置在 caddy 的 file_server 目录下,浏览器访问不是网站根目录是 caddy 会返回 404。
type
Post
将前端项目 build 后产生的静态文件放置在 caddy 的 file_server 目录下,浏览器访问不是网站根目录时 caddy 会返回 404。

产生问题的配置

:80 {
	root * /usr/share/caddy
	file_server
	reverse_proxy /api/* 127.0.0.1:8080
}
这样配置,访问 http://<ip> 能正常显示,但是访问 http://<ip>/xxxx caddy 就返回 404 了。

依然会存在其他问题的解决方案

根据 lideming 的说法,caddy 可能是认为 /xxxx 是对应 file_server 目录下的某个文件。只要将这些错误的跳转重写回 /index.html 即前端项目入口文件即可。
:80 {
	root * /usr/share/caddy
	file_server
	reverse_proxy /api/* 127.0.0.1:8080
	rewrite /* /
}
后来他翻官方文档时找到了一个 try_files 指令,也能非常简单地解决这个问题:
:80 {
	root * /usr/share/caddy
	file_server
	reverse_proxy /api/* 127.0.0.1:8080
	try_files {path} /index.html
}

又又又出现了问题,然后再再再解决

按照依然会存在其他问题的解决方案,请求后端依然会请求 /index.html(换句话说就是后端的路径也 rewrite 到前端了)。原因可能是 caddy 指令顺序的问题,try_files 指令在 reverse_proxy 指令前面,所以得用两个同级的 block 去区分它们,使它们这两个指令同级:
:80 {
        root * /usr/share/caddy/dist
        handle /api/* {
                reverse_proxy /api/* 100.101.152.29:8080
        }
        handle * {
                try_files {path} /index.html
                file_server
        }
}

参考资料

 

© therainisme 2025