Pertanyaan Aktifkan kontrol akses pada server HTTP sederhana


Saya memiliki skrip shell berikut untuk server HTTP yang sangat sederhana:

#!/bin/sh

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

Saya bertanya-tanya bagaimana saya bisa mengaktifkan atau menambahkan tajuk CORS seperti Access-Control-Allow-Origin: * ke server ini?


75
2018-02-22 16:00


asal


Jawaban:


Sayangnya, SimpleHTTPServer benar-benar sesederhana itu tidak memungkinkan kustomisasi apa pun, terutama dari header yang dikirimkannya. Namun Anda dapat membuat server HTTP sederhana sendiri, menggunakan sebagian besar SimpleHTTPServerRequestHandler, dan tambahkan saja header yang diinginkan.

Cukup buat file simple-cors-http-server.py (atau apa pun) dan letakkan bagian dalam berikut ini:

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

Maka Anda bisa melakukannya python simple-cors-http-server.py dan itu akan meluncurkan server Anda yang sudah dimodifikasi yang akan mengatur header CORS untuk setiap respons.

Dengan shebang di bagian atas, buat file dieksekusi dan masukkan ke PATH Anda, dan Anda bisa menjalankannya simple-cors-http-server.py terlalu.


Untuk solusi yang bekerja dengan Python 3, Anda dapat mengubah impor sederhana di atas untuk mengimpor dari http.server modul (semua tipe ada di sana).

Alternatifnya, Anda bisa menggunakan ini yang berfungsi baik pada Python 3 dan Python 2. Script pertama mencoba mengimpor dari lokasi Python 3 dan kembali ke 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)

129
2018-02-22 16:28



Coba alternatif seperti http-server

Karena SimpleHTTPServer tidak benar-benar jenis server yang Anda terapkan untuk produksi, saya berasumsi di sini bahwa Anda tidak terlalu peduli tentang alat apa yang Anda gunakan selama ia melakukan pekerjaan untuk mengekspos file Anda di http://localhost:3000 dengan header CORS dalam baris perintah sederhana

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

#run
http-server -p 3000 --cors

Beberapa alat terkait yang mungkin bermanfaat bagi Anda

  • ngrok: saat berlari ngrok http 3000, itu menciptakan sebuah url https://$random.ngrok.com yang memungkinkan siapa saja mengakses Anda http://localhost:3000 server Ini dapat mengekspos ke dunia apa yang berjalan secara lokal di komputer Anda (termasuk backend / apis lokal)

  • localtunnel: hampir sama dengan ngrok

  • sekarang: saat berlari now, mengunggah aset statis Anda secara online dan menerapkannya https://$random.now.sh. Mereka tetap online selamanya kecuali Anda memutuskan sebaliknya. Deployment cepat (kecuali yang pertama) berkat diffing. Sekarang cocok untuk produksi frontend / penyebaran kode SPA Ini juga dapat menggunakan aplikasi Docker dan NodeJS. Ini tidak benar-benar gratis, tetapi mereka memiliki rencana gratis.


59
2018-02-20 15:43



Anda harus memberikan contoh Anda sendiri do_GET () (dan do_HEAD () jika memilih untuk mendukung operasi HEAD). sesuatu seperti ini:

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