Frage Aktivieren Sie die Zugriffssteuerung auf einem einfachen HTTP-Server


Ich habe das folgende Shell-Skript für einen sehr einfachen HTTP-Server:

#!/bin/sh

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

Ich habe mich gefragt, wie ich aktivieren oder hinzufügen kann ein CORS-Header mögen Access-Control-Allow-Origin: * zu diesem Server?


75
2018-02-22 16:00


Ursprung


Antworten:


Unglücklicherweise, SimpleHTTPServer ist wirklich so einfach, dass es keine Anpassung erlaubt, besonders nicht die Header, die es sendet. Sie können jedoch einen einfachen HTTP-Server selbst erstellen, indem Sie die meisten davon verwenden SimpleHTTPServerRequestHandlerund fügen Sie einfach den gewünschten Header hinzu.

Erstellen Sie einfach eine Datei simple-cors-http-server.py (oder was auch immer) und lege folgendes hinein:

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

Dann kannst du es tun python simple-cors-http-server.py und es wird Ihren modifizierten Server starten, der den CORS-Header für jede Antwort setzt.

Mit dem Shebang an der Spitze, machen Sie die Datei ausführbar und legen Sie sie in Ihren Pfad, und Sie können es einfach mit ausführen simple-cors-http-server.py auch.


Für eine Lösung, die mit Python 3 funktioniert, könnten Sie einfach die obigen Importe aus dem importieren http.server Modul (alle Typen sind da).

Alternativ können Sie auch das verwenden, was sowohl auf Python 3 als auch auf Python 2 funktioniert. Das Skript versucht zunächst, von den Python 3-Speicherorten zu importieren und greift auf Python 2 zurück:

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

129
2018-02-22 16:28



Versuchen Sie eine Alternative wie HTTP-Server

Da SimpleHTTPServer nicht wirklich die Art von Server ist, den Sie in der Produktion bereitstellen, gehe ich hier davon aus, dass es Ihnen nicht so wichtig ist, welches Tool Sie verwenden, solange es Ihre Dateien aussetzt http://localhost:3000 mit CORS-Headern in einer einfachen Befehlszeile

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

#run
http-server -p 3000 --cors

Einige verwandte Tools, die Sie möglicherweise nützlich finden

  • Ngrok: beim Laufen ngrok http 3000, es erstellt eine URL https://$random.ngrok.com das erlaubt jedem Zugriff auf Ihre http://localhost:3000 Server. Es kann der Welt aussetzen, was lokal auf Ihrem Computer läuft (einschließlich lokaler Backends / Apis)

  • Lokaltunnel: fast das gleiche wie Ngrok

  • jetzt: beim Laufen nowlädt sie Ihre statischen Assets online hoch und stellt sie bereit https://$random.now.sh. Sie bleiben für immer online, wenn Sie sich nicht anders entscheiden. Der Einsatz ist schnell (außer dem ersten) dank Diffing. Jetzt ist es für die Bereitstellung von Produktions-Front-End- / SPA-Codes geeignet. Es kann auch Docker- und NodeJS-Apps bereitstellen. Es ist nicht wirklich kostenlos, aber sie haben einen freien Plan.


59
2018-02-20 15:43



Sie müssen eigene Instanzen von do_GET () (und do_HEAD () bereitstellen, wenn Sie HEAD-Operationen unterstützen). etwas wie das:

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()

0
2018-02-22 16:10