在简单的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()