【问题标题】:Enable access control on simple HTTP server在简单的 HTTP 服务器上启用访问控制
【发布时间】:2014-03-24 06:44:51
【问题描述】:

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

#!/bin/sh

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

我想知道如何在此服务器上启用或添加 a CORS header(如 Access-Control-Allow-Origin: *)?

【问题讨论】:

  • 大声笑我喜欢这个简单的服务器,使用它的要点可能是因为你不能使用本地文件,所以需要一个配置它.

标签: python cors simplehttpserver


【解决方案1】:

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

【讨论】:

  • 感谢您的回答,但我从来没有 Python 知识,我只是使用上面提到的 shell 脚本作为我的 Emberjs 应用程序的简单 http 服务器。只有在碰到访问控制问题的时候,我才研究发现需要在这个简单的http服务器中启用它。所以经过一些研究,我添加了(启用'CrossOrigin',origins =>'*';)但并不奇怪它没有工作。如果可以的话,请指出任何 Python 简单的 http 服务器 shell 脚本,其中包含将受到高度赞赏的访问控制功能
  • 顺便说一句,我并不是真的想在这里偷懒,而是开始学习python只是为了将此功能添加到simpleHTTP服务器在这一点上听起来不合逻辑,所以我希望它会是易于添加或希望我能找到一个替代/现成的 Python 脚本来完成这项工作,以便我可以继续我的开发工作
  • SimpleHTTPServer 没有支持访问控制的选项。您要么需要编写自己的代码,要么切换到另一个支持访问控制的 Web 服务器。想想lighttpd.net
  • 对于采用这种方法的任何人,如果您希望它支持“非简单”cors 请求(需要“预检”权限的请求),您将需要实现一个 do_OPTIONS 方法,该方法返回 204 响应以下标题:“Access-Control-Allow-Origin”、“Access-Control-Allow-Methods”和“Access-Control-Allow-Headers”。
【解决方案2】:

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

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

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

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

Python 3 解决方案

Python 3 使用来自http.server moduleSimpleHTTPRequestHandlerHTTPServer 来运行服务器:

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

【讨论】:

  • @poke 服务器以 501 Unsupported method ('OPTIONS') 响应。我正在使用 Python 2.7.6 运行 OS X 10.10.1。有什么建议? HTTP/1.0 501 Unsupported method ('OPTIONS') Server: SimpleHTTP/0.6 Python/2.7.6 Date: Wed, 21 Jan 2015 23:16:10 GMT Content-Type: text/html Connection: close Access-Control-Allow-Origin: *
  • @HairOfTheDog SimpleHTTPRequestHandler 不支持 OPTIONS HTTP 方法。如果需要,您可以添加它(阅读有关 HTTP 服务器的 Python 手册);或者你不能尝试像那样访问服务器。
  • 这看起来不错,但这仍然有效吗?我刚刚尝试过,我的 Chrome 一直在控制台中抱怨。
  • @RobertoFranceschini 您可能会遇到preflighted requests,这需要正确实现OPTIONS 方法。至于简单的请求,只发送Access-Control-Allow-Origin 标头的解决方案应该仍然可以正常工作。
  • @Tyguy7 这可能是简单 HTTP 服务器的一般行为。我之前在性能方面有不同的结果。但是对于简单地运行一个服务器,我仍然认为它是最快的解决方案。
【解决方案3】:

试试 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 https://$random.ngrok.com,允许任何人访问您的http://localhost:3000 服务器。它可以向世界公开您计算机上本地运行的内容(包括本地后端/api)

  • localtunnel:和ngrok差不多

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

【讨论】:

  • 我是一个简单的人。我看到一个解决方案需要在一台只知道有python 的机器上安装npm,我投反对票。
  • @ParthianShot:你可能想学习使用最好的工具来完成这项工作。
  • @ParthianShot 许多开发人员已经安装了 node/npm。问题标题足够通用,足以吸引大量显然不关心 python 或 SimpleHTTPServer 的用户,这一点得到了支持。并不是因为它对你没有帮助,而是它适合所有人。有充分的理由不喜欢 Node 和 Python。 leftpad/bad publish/bad git usage 之类的事情似乎与我完全无关。
  • 添加额外的语言和框架会导致技术债务增加环境的攻击面。 “任何编程语言都可能犯致命错误” 没错,但 JS 比大多数其他语言更容易做到这一点。每种语言都有陷阱;您使用的语言越少,某些不熟悉其中一种语言的开发人员犯下在另一种语言中不会犯的错误的可能性就越小。
  • 这就像每次在家里需要帮助时收养一个孩子;它产生的问题多于解决的问题。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    python3 -m pip install livehttp
    

    转到您的文件夹,然后运行livehttp。就是这样。

    http://localhost:5000

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多