You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python HTTP Server时如何禁用目录列表功能

Python HTTP Server 禁用目录列表配置方法

Python 标准库 http.server 模块默认使用的 SimpleHTTPRequestHandler 会在访问映射到服务端目录的路径时,自动返回目录下所有文件的列表,包含你提到的带多斜杠的特殊路径(如https://localhost:8080///)——这类路径会被服务端自动做路径规范化,最终指向WebUI部署根目录,默认会触发目录列表返回。

可以通过以下方式彻底禁用该功能:

  • 核心思路:重写请求处理器的目录列表生成逻辑,同时在路径解析完成后做目录校验,避免多斜杠、路径穿越字符绕过拦截。

通用自定义Handler实现(全Python3版本兼容)

自定义继承SimpleHTTPRequestHandler的处理类,重写两个核心方法:

  1. 重写list_directory方法,直接拦截所有目录列表生成请求,返回403状态码
  2. 重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:27:23