使用Python HTTP Server时如何禁用目录列表功能
Python HTTP Server 禁用目录列表配置方法
Python 标准库 http.server 模块默认使用的 SimpleHTTPRequestHandler 会在访问映射到服务端目录的路径时,自动返回目录下所有文件的列表,包含你提到的带多斜杠的特殊路径(如https://localhost:8080///)——这类路径会被服务端自动做路径规范化,最终指向WebUI部署根目录,默认会触发目录列表返回。
可以通过以下方式彻底禁用该功能:
- 核心思路:重写请求处理器的目录列表生成逻辑,同时在路径解析完成后做目录校验,避免多斜杠、路径穿越字符绕过拦截。
通用自定义Handler实现(全Python3版本兼容)
自定义继承SimpleHTTPRequestHandler的处理类,重写两个核心方法:
- 重写
list_directory方法,直接拦截所有目录列表生成请求,返回403状态码 - 重写
translate_path方法,在路径规范化完成后判断目标是否为目录:如果目录下存在入口文件(如index.html)则返回入口文件,不存在则直接返回403,从根源避免目录遍历。
可直接复用的服务启动代码:
from http.server import SimpleHTTPRequestHandler, HTTPServer import os class ForbidDirListHandler(SimpleHTTPRequestHandler): def list_directory(self, path): self.send_error(403, "Directory access is forbidden") return None def translate_path(self, path): # 调用原生方法完成路径解析、规范化,自动处理多斜杠、../、编码路径等特殊格式 real_path = super().translate_path(path) if os.path.isdir(real_path): # 优先返回目录下的index.html作为首页 index_file = os.path.join(real_path, "index.html") if os.path.isfile(index_file): return index_file # 无首页则直接触发403 self.send_error(403, "Directory access is forbidden") return real_path if __name__ == "__main__": listen_port = 8080 server = HTTPServer(("127.0.0.1", listen_port), ForbidDirListHandler) print(f"WebUI service started at http://localhost:{listen_port}") server.serve_forever()
临时启动快速适配方案
如果是临时通过命令行快速启动服务(执行python -m http.server 8080),可以在部署根目录以及所有子目录下放置一个空的index.html文件,服务会优先返回该文件,不会触发目录列表。但该方案无法覆盖后续新增的无index文件的子目录,仅适合临时测试场景,正式部署推荐使用上面的自定义Handler方案。
注意:不要通过简单匹配路径中多斜杠的方式做拦截,服务端会自动对请求路径做解码、规范化处理,类似
/./、/../、编码斜杠%2f、多斜杠组合的路径最终都会被解析为真实目录路径,必须在路径解析完成后做类型判断,才能彻底避免绕过。
内容的提问来源于stack exchange,提问作者user17658201
相关产品推荐
相关产品推荐

