在简单的HTTP服务器上启用访问控制

我有一个非常简单的HTTP服务器的以下shell脚本:

#!/bin/sh echo "Serving at http://localhost:3000" python -m SimpleHTTPServer 3000 

我想知道如何启用或添加像Access-Control-Allow-Origin: *到这个服务器的CORS头 ?

不幸的是, SimpleHTTPServer真的很简单,它不允许任何自定义,特别是不发送它的头。 但是,您可以自己创build一个简单的HTTP服务器,使用SimpleHTTPServerRequestHandler大部分,只需添加所需的头。

简单地创build一个文件simple-cors-http-server.py (或其他),并把以下内容:

 #!/usr/bin/env python2 from SimpleHTTPServer import SimpleHTTPRequestHandler import BaseHTTPServer class CORSRequestHandler (SimpleHTTPRequestHandler): def end_headers (self): self.send_header('Access-Control-Allow-Origin', '*') SimpleHTTPRequestHandler.end_headers(self) if __name__ == '__main__': BaseHTTPServer.test(CORSRequestHandler, BaseHTTPServer.HTTPServer) 

然后你可以做python simple-cors-http-server.py ,它会启动你的修改服务器,它将为每个响应设置CORS头。

使用顶部的shebang,将文件设置为可执行文件并将其放入PATH中,然后使用simple-cors-http-server.py来运行它。


对于与Python 3一起工作的解决scheme,您可以简单地更改上面的导入从http.server模块导入(所有types都在那里)。

另外,你可以使用Python 3和Python 2都可以使用的脚本。脚本首先尝试从Python 3的位置导入并返回到Python 2:

 #!/usr/bin/env python try: # Python 3 from http.server import HTTPServer, SimpleHTTPRequestHandler, test as test_orig import sys def test (*args): test_orig(*args, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000) except ImportError: # Python 2 from BaseHTTPServer import HTTPServer, test from SimpleHTTPServer import SimpleHTTPRequestHandler class CORSRequestHandler (SimpleHTTPRequestHandler): def end_headers (self): self.send_header('Access-Control-Allow-Origin', '*') SimpleHTTPRequestHandler.end_headers(self) if __name__ == '__main__': test(CORSRequestHandler, HTTPServer) 

尝试一个像HTTP服务器的替代

由于SimpleHTTPServer实际上并不是您部署到生产环境中的那种服务器,因此我假定您并不关心使用哪种工具,只要它能够在http://localhost:3000上公开您的文件即可http://localhost:3000在CORS标题在一个简单的命令行

 # install (it requires nodejs/npm) npm install http-server -g #run http-server -p 3000 --cors 

您可能会发现有用的一些相关工具

  • ngrok :运行ngrok http 3000 ,会创build一个urlhttps://$random.ngrok.com ,允许任何人访问您的http://localhost:3000服务器。 它可以向全世界公开本地在您的计算机上运行的内容(包括本地后端/ apis)

  • 现在 : 现在运行时,它会在线上传您的静态资产并将其部署到https://$random.now.sh 。 除非您另有决定,否则它们将永远在线。 部署是快速的(除了第一个)由于差异。 现在适用于生产前端/ SPA代码部署它也可以部署Docker和NodeJS应用程序。 这不是真的免费,但他们有一个免费的计划。

如果select支持HEAD操作,则需要提供自己的do_GET()(和do_HEAD())实例。 像这样的东西:

 class MyHTTPServer(SimpleHTTPServer): allowed_hosts = (('127.0.0.1', 80),) def do_GET(self): if self.client_address not in allowed_hosts: self.send_response(401, 'request not allowed') else: super(MyHTTPServer, self).do_Get()