Pytanie Włącz kontrolę dostępu na prostym serwerze HTTP


Mam następujący skrypt powłoki dla bardzo prostego serwera HTTP:

#!/bin/sh

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

Zastanawiałem się, jak mogę włączyć lub dodać nagłówek CORS lubić Access-Control-Allow-Origin: * do tego serwera?


76
2018-02-22 16:00


pochodzenie




Odpowiedzi:


Niestety, SimpleHTTPServer jest naprawdę tak prosty, że nie pozwala na żadne dostosowanie, szczególnie na nagłówki, które wysyła. Możesz jednak sam stworzyć prosty serwer HTTP, używając większości SimpleHTTPServerRequestHandleri po prostu dodaj żądany nagłówek.

Po prostu utwórz plik simple-cors-http-server.py (lub cokolwiek) i umieścić w środku:

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

Wtedy możesz to zrobić python simple-cors-http-server.py i uruchomi twój zmodyfikowany serwer, który ustawi nagłówek CORS dla każdej odpowiedzi.

Z shebang na górze, spraw, aby plik wykonywalny i umieścić go w swojej PATH, i możesz po prostu uruchomić go za pomocą simple-cors-http-server.py także.


Aby znaleźć rozwiązanie współpracujące z Pythonem 3, możesz łatwo zmienić powyższe importowanie, aby zaimportować dane z http.server moduł (wszystkie typy są tam).

Alternatywnie możesz użyć tego, który działa zarówno w Pythonie 3, jak i Pythonie 2. Skrypt próbuje najpierw importować z lokalizacji Pythona 3 i powraca do Pythona 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)

130
2018-02-22 16:28



Postępowałem zgodnie z instrukcjami, ale po uruchomieniu python simple-cors-http-server.py dostaję błąd: python: nie można otworzyć pliku 'simple-cors-http-server.py': [Errno 2] Brak takiego pliku lub wylogowania z katalogu ....jakieś pomysły? - MChan
Wtedy albo nie nazwałeś tego pliku poprawnie, albo nie ma go w bieżącym katalogu. Błąd mówi tylko, że Python próbuje wykonać plik, ale nie może znaleźć pliku. - poke
@poke Serwer odpowiada metodą 501 Unsupported ("OPTIONS"). Używam systemu OS X 10.10.1 z Pythonem 2.7.6. Jakieś sugestie? 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
@HairOfTheDog SimpleHTTPRequestHandler nie obsługuje metody HTTP OPTIONS. Możesz go dodać, jeśli chcesz (przeczytaj podręcznik Pythona na temat serwerów HTTP); lub możesz po prostu nie próbować uzyskać dostępu do serwera w ten sposób. - poke
@RobertoFranceschini Być może uciekniesz żądania preflighted które wymagają OPTIONS metoda powinna być właściwie wdrożona. Jeśli chodzi o proste żądania, rozwiązanie wysyłania tylko Access-Control-Allow-Origin nagłówek powinien nadal działać poprawnie. - poke


Wypróbuj alternatywę taką jak serwer http

Ponieważ SimpleHTTPServer nie jest tak naprawdę serwerem, który wdrożysz do produkcji, zakładam, że nie dbasz o to, z którego narzędzia korzystasz, dopóki nie ujawniasz swoich plików http://localhost:3000 z nagłówkami CORS w prostej linii poleceń

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

#run
http-server -p 3000 --cors

Niektóre powiązane narzędzia mogą okazać się przydatne

  • ngrok: podczas pracy ngrok http 3000, tworzy adres URL https://$random.ngrok.com który pozwala każdemu uzyskać dostęp do twojego http://localhost:3000 serwer. Może narazić światu, co działa lokalnie na twoim komputerze (w tym na lokalnych serwerach / apisach)

  • localtunnel: prawie taki sam jak ngrok

  • teraz: podczas pracy now, przesyła zasoby statyczne online i wdraża je https://$random.now.sh. Pozostaną w trybie online na zawsze, chyba że zdecydujesz inaczej. Wdrożenie jest szybkie (z wyjątkiem pierwszego) dzięki różnym wersjom. Teraz nadaje się do wdrożenia frontend / wdrożenia kodu SPA. Może również wdrażać aplikacje Docker i NodeJS. To naprawdę nie jest za darmo, ale mają darmowy plan.


59
2018-02-20 15:43



z jakiegoś powodu to nie działa. - アレックス
działa dobrze dla całego mojego zespołu. wyjaśnij swój problem, proszę - Sebastien Lorber
To rozwiązanie było dla mnie znacznie lepsze niż pytona, które miało sporadyczne opóźnienie. - Tyguy7
Jestem prostym człowiekiem. Widzę rozwiązanie, które wymaga instalacji npm na maszynie, o której wiadomo tylko, że ma python, Zgłaszam. - Parthian Shot


Będziesz musiał podać własne instancje do_GET () (i do_HEAD (), jeśli zdecydujesz się na obsługę operacji HEAD). coś takiego:

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



Dziękuję za odpowiedź, ale nie posiadam wiedzy na temat Pythona, ale używam tylko wspomnianego wcześniej skryptu powłoki jako prostego serwera http dla moich aplikacji Emberjs. Dopiero po zderzeniu z problemem kontroli dostępu sprawdziłem, czy muszę go włączyć na tym prostym serwerze http. Więc po kilku badaniach dodałem (włącz "CrossOrigin", origins => '*';), ale nic dziwnego, że to nie zadziałało. Jeśli możesz wskazać mi dowolny skrypt Pythona prosty skrypt powłoki serwera, który zawiera funkcję kontroli dostępu, która będzie bardzo ceniona - MChan
Na drobne uwagi, nie próbuję być leniwym tutaj naprawdę, ale rozpocznij naukę Pythona, aby dodać tę funkcję do prostego serwera HTTTP nie brzmi logicznie w tym momencie, więc miałem nadzieję, że będzie łatwo dodać LUB mam nadzieję, że mogę znaleźć alternatywny / gotowy skrypt w języku Python, który może wykonać zadanie, aby móc kontynuować pracę z dev - MChan
SimpleHTTPServer nie ma opcji obsługi kontroli dostępu. Musisz przetasować własny kod lub przełączyć się na inny serwer sieciowy obsługujący kontrolę dostępu. Myśleć o lighttpd.net - user590028