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

问题描述 投票:0回答:7

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

#!/bin/sh

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

我想知道如何启用或添加 CORS 标头(如

Access-Control-Allow-Origin: *
)到此服务器?

python cors simplehttpserver
7个回答
297
投票

不幸的是,简单的 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
模块中的
HTTPServer
http.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.SimpleHTTPRequestHandler
BaseHTTPServer
模块
来运行服务器。

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

173
投票

尝试像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,您也可以尝试 caddycertbot


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

就跑吧

npx serve --cors


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

  • ngrok:运行

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

  • localtunnel:与ngrok几乎相同

  • now:运行

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


9
投票

我遇到了同样的问题并找到了这个解决方案:

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


4
投票

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

python3 -m pip install livehttp

转到您的文件夹,然后运行

livehttp
。仅此而已。

http://localhost:5000


2
投票

您需要提供自己的 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()

1
投票

我的工作代码:

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

0
投票

我正在使用 python one-liner 添加

Access-Control-Allow-Origin
标头和 bash 的
alias
功能。在这种情况下,我们不需要存储自定义 python 脚本。

您只需添加

alias srv='echo -e "from sys import argv as a\nfrom http.server import HTTPServer as H, SimpleHTTPRequestHandler as HH, test as t\nclass C(HH):\n def end_headers (self):\n  self.send_header(a[2],a[3])\n  HH.end_headers(self)\nt(C,H,port=int(a[1]))" | /usr/bin/env python3 -- - 8000 "Access-Control-Allow-Origin" "*"'

插入

~/.bashrc
文件并通过
srv
命令运行简单的服务器

© www.soinside.com 2019 - 2024. All rights reserved.