Включить контроль доступа на простом HTTP-сервере
у меня есть следующий скрипт для очень простого HTTP-сервера:
#!/bin/sh
echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000
мне было интересно, как я могу включить или добавить заголовок CORS как Access-Control-Allow-Origin: * на этот сервер?
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, Он создает urlhttps://$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()
Comments