Caddy2 file server 自动重定向问题

一、事情起因

自打很多年前开始使用静态博客工具来发布博客,现在基本上博客源码编译后就是一堆 html 等静态文件;一开始使用 nginx 作为静态文件服务器,后来切换到的 Caddy2;不过最近在 Google Search Console 中发现了大量的无效链接,给出的提示是 “网页会自动重定向”。

经过测试后发现这些链接地址在访问时都会重定向一下,然后在结尾加上 /;没办法我就开始探索这个 / 是怎么来的了。

二、源码分析

没办法,也不知道那个配置影响的,只能去翻 file server 的源码,在几经查找之后找到了以下代码(而且还带着注释):

从代码逻辑上看,只要 *fsrv.CanonicalURIs 这个变量为 true,那么就会触发自动重定像,并在 “目录” 尾部补上 /;注释里也说的很清楚是为了目录规范化,如果想看详细讨论可以参考那两个 issue。

三、解决方案

3.1、Admin API

翻了这个 *fsrv.CanonicalURIs 变量以后,突然发现 Caddyfile 里其实是不支持这个配置的;所以比较 low 的办法就是利用 Admin API,先把 json 弄出来,然后加上配置再。POST 回去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"apps": {
"http": {
"servers": {
"srv0": {
"listen": [
":80"
],
"routes": [
{
"handle": [
{
+ "canonical_uris": false,
"handler": "file_server",
"hide": [
"./Caddyfile"
]
}
]
}
]
}
}
}
}
}
1
curl -XPOST http://localhost:2019/load -H "Content-Type: application/json" -d @caddy.json

3.2、升级版本

现在可以直接从 master 构建 Caddy,或者等待 v2.4.4 版本发布,这两种方式产生的 Caddy 二进制文件已经支持了这个配置选项,配置样例如下:

1
2
3
4
5
:80

file_server {
disable_canonical_uris
}

Caddy2 file server 自动重定向问题
https://mritd.com/2021/07/02/fix-caddy2-fileserver-auto-redirect/
作者
Kovacs
发布于
2021年7月2日
许可协议