157

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

#!/bin/sh

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

我想知道如何为该服务器启用或添加CORS 标头?Access-Control-Allow-Origin: *

4

5 回答 5

234

不幸的是,简单的 HTTP 服务器真的很简单,它不允许任何定制,尤其是它发送的标头。但是,您可以自己创建一个简单的 HTTP 服务器,使用大部分SimpleHTTPRequestHandler,然后添加所需的标头。

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

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

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

Python 3 解决方案

Python 3 使用SimpleHTTPRequestHandlerand HTTPServerfromhttp.server模块来运行服务器:

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

如果您需要 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)
于 2014-02-22T16:28:45.903 回答
145

尝试像 http-server 这样的替代方案

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

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

#run
http-server -p 3000 --cors

需要 HTTPS?

如果您在本地需要 https,您也可以尝试caddycertbot


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

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

  • localtunnel:与 ngrok 几乎相同

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

于 2015-02-20T15:43:28.297 回答
4

try this: https://github.com/zk4/livehttp. support CORS.

python3 -m pip install livehttp

goto your folder, and run livehttp. that`s all.

http://localhost:5000

于 2021-04-29T17:14:15.950 回答
3

I had the same problem and came to this solution:

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

I simply created a new class inheriting from SimpleHTTPRequestHandler that only changes the send_response method.

于 2018-12-20T09:58:57.773 回答
0

您需要提供自己的 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()
于 2014-02-22T16:10:22.483 回答