serve.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/env python3
  2. """极简静态服务器(带 SPA 路由回退)—— 用户空间,CentOS 自带 Python 3.6 即可。
  3. 托管前端构建产物(deploy 分支的 dist),供内网访问。客户端路由(如
  4. /behavior/funnel/group)刷新时回退到 index.html,避免 404。
  5. 兼容 Python 3.6(不用 3.7+ 的 `directory=` 参数,改 os.chdir)。
  6. 用法:
  7. python3 serve.py <静态目录> [端口]
  8. 例:
  9. nohup python3 ~/serve-hs.py ~/hs-data 6666 > ~/hs-web.log 2>&1 &
  10. """
  11. import os
  12. import sys
  13. from http.server import SimpleHTTPRequestHandler
  14. from socketserver import ThreadingTCPServer
  15. ROOT = os.path.abspath(sys.argv[1] if len(sys.argv) > 1 else ".")
  16. PORT = int(sys.argv[2]) if len(sys.argv) > 2 else 6666
  17. os.chdir(ROOT)
  18. class SpaHandler(SimpleHTTPRequestHandler):
  19. def do_GET(self):
  20. # 路径不是真实文件 → 回退到 index.html(SPA 客户端路由)。
  21. rel = self.path.split("?", 1)[0].split("#", 1)[0].lstrip("/")
  22. if rel and not os.path.isfile(os.path.join(ROOT, rel)):
  23. self.path = "/index.html"
  24. return SimpleHTTPRequestHandler.do_GET(self)
  25. def end_headers(self):
  26. # index.html 不缓存(构建产物自带 hash,可长缓存)。
  27. if self.path in ("/", "/index.html"):
  28. self.send_header("Cache-Control", "no-cache")
  29. SimpleHTTPRequestHandler.end_headers(self)
  30. class Server(ThreadingTCPServer):
  31. allow_reuse_address = True
  32. daemon_threads = True
  33. if __name__ == "__main__":
  34. print("serving %s on 0.0.0.0:%d (SPA fallback)" % (ROOT, PORT))
  35. Server(("0.0.0.0", PORT), SpaHandler).serve_forever()