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

下面是一个非常简单的 HTTP 服务器的 shell 脚本:

#!/bin/sh


echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000

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

122036 次浏览

您需要提供自己的 do _ GET ()实例(如果选择支持 HEAD 操作,还需要 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()

不幸的是,简单的 HTTP 服务器实际上非常简单,它不允许任何自定义,特别是不允许对它发送的头进行自定义。然而,您可以自己创建一个简单的 HTTP 服务器,使用大部分 SimpleHTTPRequestHandler,并只添加所需的头。

为此,只需创建一个文件 simple-cors-http-server.py(或其他文件) ,并根据所使用的 Python 版本将下列代码之一放入其中。

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

开始吧放在顶部,使文件成为可执行文件并将其放入 PATH 中,您也可以使用 simple-cors-http-server.py运行它。

Python 3解决方案

Python 3使用 http.server模块中的 SimpleHTTPRequestHandlerHTTPServer来运行服务器:

#!/usr/bin/env python3
from http.server import HTTPServer, SimpleHTTPRequestHandler, test
import sys


class CORSRequestHandler (SimpleHTTPRequestHandler):
def end_headers (self):
self.send_header('Access-Control-Allow-Origin', '*')
SimpleHTTPRequestHandler.end_headers(self)


if __name__ == '__main__':
test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)

Python 2解决方案

Python 2使用 SimpleHTTPServer.SimpleHTTPRequestHandlerBaseHTTPServer模块来运行服务器。

#!/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 2 & 3解决方案

如果需要同时兼容 Python3和 Python2,可以使用这个两个版本都可以使用的多语言脚本。它首先尝试从 Python3位置导入,否则返回到 Python2:

#!/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-server

由于 SimpleHTTPServer 并不是您部署到生产环境中的那种服务器,我在这里假设您并不太关心使用哪种工具,只要它能够在简单的命令行中使用 CORS 头在 http://localhost:3000暴露您的文件

# install (it requires nodejs/npm)
npm install http-server -g


#run
http-server -p 3000 --cors

需要 HTTPS 吗?

如果您需要在本地的 https,您也可以尝试 球童Certbot


编辑2022 : 现在我最喜欢的解决方案是由 Next.js 内部使用的 发球

运行 npx serve --cors


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

  • Ngrok : 当运行 ngrok http 3000时,它创建一个 URL https://$random.ngrok.com,允许任何人访问您的 http://localhost:3000服务器。它可以公开在计算机本地运行的内容(包括本地后端/apis)

  • 本地隧道 : 几乎与 ngrok 相同

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

我遇到了同样的问题,于是想出了这个解决方案:

class Handler(SimpleHTTPRequestHandler):
def send_response(self, *args, **kwargs):
SimpleHTTPRequestHandler.send_response(self, *args, **kwargs)
self.send_header('Access-Control-Allow-Origin', '*')

我只是创建了一个继承自 SimpleHTTPRequestHandler 的新类,它只更改 send_response方法。

试试这个: https://github.com/zk4/livehttp。支持 CORS。

python3 -m pip install livehttp

进入你的文件夹,运行 livehttp,就这样。

Http://localhost:5000

我的工作代码:

self.send_response(200)
self.send_header( "Access-Control-Allow-Origin", "*")
self.end_headers()
self.wfile.write( bytes(json.dumps( answ ), 'utf-8'))