优先选用fancyindex模块美化autoindex页面:debian/ubuntu用户执行sudo apt install libnginx-mod-http-fancyindex,将autoindex on改为fancyindex on并添加charset utf-8;;centos/rhel需重编译nginx加入ngx-fancyindex模块。

默认的 autoindex 页面就是纯 HTML 表格,没 CSS、没图标、不支持排序,连 都没有,所以直接加 link 标签无效。真要改样式,别硬套 CSS 注入,优先选 fancyindex——它专为这事设计,且 Debian/Ubuntu 可一键装好。
为什么 sub_filter 注入 CSS 会失败
很多人试过用 sub_filter 把 替换成 <link rel="stylesheet" ...>,但实际不生效。原因很实在:autoindex on 生成的 HTML 根本不含 标签,只有 <title>Index of /</title>
<pre class="brush:php;toolbar:false;">...</pre> 这种极简结构,sub_filter 找不到替换锚点。更麻烦的是,即使你强行注入了样式链接,浏览器也可能因缺失 Content-Security-Policy 头而拦截外部 CSS 加载。
Debian/Ubuntu 用户:直接 apt 装 fancyindex 模块
这是最快落地的方案,不用编译、不碰源码:
- 运行
sudo apt install libnginx-mod-http-fancyindex(注意包名不是nginx-module-fancyindex) - 确认模块已加载:
nginx -V 2>&1 | grep -o fancyindex,有输出即成功 - 把原配置里的
autoindex on换成fancyindex on,其他参数也换前缀:fancyindex_exact_size off、fancyindex_localtime on -
fancyindex_header和fancyindex_footer必须指向真实可访问的 HTML 文件路径,比如/var/www/html/fancy/header.html,且该路径必须在root或alias范围内 - 别漏掉
charset utf-8;,否则 header 文件里的中文照样乱码
CentOS/RHEL 用户:重编译 Nginx 是绕不开的
官方源和 EPEL 都不提供预编译的 fancyindex 模块,跳过这步就只能退回 sub_filter + 反向代理这种不稳定方案:
- 先查当前 Nginx 版本:
nginx -v,再查编译参数:nginx -V 2>&1 | grep "configure arguments" - 下载对应版本 Nginx 源码(如
nginx-1.24.0.tar.gz)和ngx-fancyindex源码(GitHub release 页面找匹配 tag,如v0.4.3) -
./configure命令必须完整复刻原参数,并追加--add-module=/path/to/ngx-fancyindex - 之后
make && sudo make install,注意备份原二进制或保留旧版本路径
autoindex 基础配置不生效?先盯死三处
哪怕不用 fancyindex,autoindex on 本身也常因配置位置错误而失效:
- 必须写在匹配目标路径的
location块里,例如想开放/downloads/,就得写location /downloads/ { autoindex on; } - 不能被上级
autoindex off覆盖——检查http或server块有没有全局关闭,Nginx 总是取嵌套最深、匹配最精确的那个location -
root或alias路径必须真实存在且权限正确:Nginx 工作进程(如nginx或www-data)得能进入目录及其所有父目录 - 补上
autoindex_format html;(1.7.9+ 才支持),否则可能返回纯文本;加上charset utf-8;,否则中文文件名显示为%E6%96%87%E4%BB%B6或方块
真正卡住人的地方,往往不是“会不会配”,而是 fancyindex_header 指向的文件路径不在 root 下、或者 charset utf-8 漏写在 location 外导致 header 中文乱码——这两个点最容易被忽略,一卡就是半天。











