Apache htaccess按查询字符串配置访问规则时文件夹不显示文件列表
问题描述
- 基于Apache htaccess配置访问规则,要求URL携带值为
123的token查询参数时,才允许访问目标文件夹 - 目标文件夹内无html、php类网页文件,仅存放mp3格式音频文件
- 配置生效后,直接访问文件夹内的单个mp3文件可正常打开,但访问文件夹根路径时,渲染出的目录文件列表为空,异常效果如下:

故障原因
配置的参数校验规则拦截范围覆盖了Apache目录索引模块(mod_autoindex)的内部请求:该模块负责扫描目录文件、生成文件列表,执行扫描动作时属于服务器内部子请求,不会继承访问URL上携带的token=123参数,直接被权限规则拦截,最终渲染出来的文件列表为空。直接访问单个mp3文件属于外部请求,携带合法token即可正常通过校验。
修复步骤
将目标文件夹下的.htaccess文件内容替换为以下规则即可:
# 开启目录浏览,配置索引展示规则 Options +Indexes IndexOptions FancyIndexing NameWidth=* HTMLTable Charset=UTF-8 # 目录列表仅展示mp3格式文件 IndexIgnore * IndexIgnore *.mp3 RewriteEngine On # 放行目录索引模块的内部扫描子请求,解决列表为空问题 RewriteCond %{IS_SUBREQ} ^true$ RewriteRule ^ - [L] # 核心访问校验:未携带正确token直接返回403 RewriteCond %{QUERY_STRING} !(^|&)token=123(&|$) [NC] RewriteRule ^ - [F,L] # 可选配置:自动给目录列表内的mp3链接追加token参数,点击无需手动补参数 <IfModule mod_headers.c> <IfModule mod_substitute.c> AddOutputFilterByType SUBSTITUTE text/html Substitute "s|(href=\"[^\"]+\.mp3)\"|$1?token=123\"|i" </IfModule> </IfModule>
配置前提:站点对应目录的
AllowOverride配置需设置为All,确保htaccess规则可覆写目录配置;如果服务器未加载mod_substitute模块,可删掉可选配置段,访问文件时手动在URL后拼接?token=123即可正常访问。
配置完成后清理浏览器缓存,携带?token=123参数访问文件夹根路径即可看到完整的mp3文件列表。
内容的提问来源于stack exchange,提问作者user19419156
相关产品推荐
相关产品推荐

