Включить контроль доступа на простом HTTP-сервере



у меня есть следующий скрипт для очень простого HTTP-сервера:

#!/bin/sh

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

мне было интересно, как я могу включить или добавить заголовок CORS как Access-Control-Allow-Origin: * на этот сервер?

206   3  

3 ответов:

к сожалению, простой HTTP-сервер действительно настолько прост, что он не позволяет никакой настройки, особенно для заголовков, которые он отправляет. Однако вы можете создать простой HTTP-сервер самостоятельно, используя большую часть SimpleHTTPRequestHandler, и просто добавьте нужный заголовок.

для этого просто создайте файл simple-cors-http-server.py (или что-то еще) и, в зависимости от версии Python, которую вы используете, поместите один из следующих кодов внутри.

затем вы можете сделать python simple-cors-http-server.py и он начнет свой модифицированный сервер, который установит заголовок CORS для каждого ответа.

С shebang в верхней части, сделать исполняемый файл и положить его в свой путь, и вы можете просто запустить его с помощью simple-cors-http-server.py тоже.

Python 3 solution

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 solution

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 solution

Если вам нужна совместимость для 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)

попробуйте альтернативу, как http-server

поскольку SimpleHTTPServer на самом деле не тот сервер, который вы развертываете для производства, я предполагаю, что вам все равно, какой инструмент вы используете, пока он выполняет работу по предоставлению ваших файлов в http://localhost:3000 с заголовками CORS в простой командной строке

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

#run
http-server -p 3000 --cors

некоторые связанные инструменты, которые вы можете найти полезными

  • сайту ngrok: когда работает ngrok http 3000, Он создает url https://$random.ngrok.com что позволяет любому получить доступ к вашей http://localhost:3000 сервер. Он может открыть миру то, что работает локально на вашем компьютере (включая локальные движки/АФИ)

  • localtunnel: почти то же самое, что нгрок

  • теперь: при работе now, он загружает ваши статические активы в интернете и развертывает их в https://$random.now.sh. Они остаются в сети навсегда, если вы не решите иначе. Развертывание быстро (кроме первого) спасибо сравниваете. Теперь подходит для развертывания производственного интерфейса/кода SPA он также может развертывать приложения Docker и NodeJS. Это не совсем бесплатно, но у них есть свободный план.

вам нужно будет предоставить свои собственные экземпляры do_GET () (и do_HEAD (), если вы решите поддерживать операции 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()
    Ничего не найдено.

Добавить ответ:
Отменить.