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

时间:2014-02-22 16:00:27

标签: python cors simplehttpserver

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

#!/bin/sh

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

我想知道如何启用或添加Access-Control-Allow-Origin: * {{1}}到此服务器?

5 个答案:

答案 0 :(得分:152)

不幸的是,简单的HTTP服务器非常简单,它不允许任何自定义,特别是它不发送的标头。但是,您可以使用大多数SimpleHTTPRequestHandler自己创建一个简单的HTTP服务器,并添加所需的标头。

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

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

shebang置于顶部,使文件可执行并将其放入PATH,您也可以使用simple-cors-http-server.py运行它。

Python 3解决方案

Python 3使用SimpleHTTPRequestHandler中的HTTPServerhttp.server module来运行服务器:

#!/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 module来运行服务器。

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

如果您需要兼容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)

答案 1 :(得分:82)

尝试使用像http-server

这样的替代方案

由于SimpleHTTPServer实际上不是您部署到生产环境中的那种服务器,我假设您不必关心使用哪种工具,只要它能够在{{1在一个简单的命令行中使用CORS头文件

http://localhost:3000

需要HTTPS吗?

如果您需要在本地使用https,还可以尝试caddycertbot


您可能会觉得有用的一些相关工具

  • ngrok:运行# install (it requires nodejs/npm) npm install http-server -g #run http-server -p 3000 --cors 时,会创建一个允许任何人访问您的ngrok http 3000服务器的网址https://$random.ngrok.com。它可以向世界公开在您的计算机上本地运行的内容(包括本地后端/ apis)

  • localtunnel:与ngrok

  • 几乎相同
  • now:在运行http://localhost:3000时,它会在线上传您的静态资源并将其部署到now。除非您另有决定,否则他们将永远在线。由于差异化,部署速度很快(第一个除外)。现在适用于生产前端/ SPA代码部署它还可以部署Docker和NodeJS应用程序。它并非真正免费,但他们有免费的计划。

答案 2 :(得分:0)

我遇到了同样的问题,并提出了解决方案:

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方法。

答案 3 :(得分:0)

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

python3 -m pip install livehttp

转到您的文件夹,然后运行 ​​livehttp。仅此而已。

http://localhost:5000

答案 4 :(得分:-1)

如果选择支持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()