Basit HTTP sunucusunda erişim kontrolünü etkinleştirin


122

Çok basit bir HTTP sunucusu için aşağıdaki kabuk betiğine sahibim:

#!/bin/sh

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

Bu sunucuya benzer bir CORS başlığını nasıl etkinleştirebileceğimi veya ekleyebileceğimi merak ediyordum.Access-Control-Allow-Origin: *

Yanıtlar:


197

Ne yazık ki, basit HTTP sunucusu gerçekten o kadar basit ki, özellikle gönderdiği başlıklar için herhangi bir özelleştirmeye izin vermiyor. Bununla birlikte, çoğunu kullanarak basit bir HTTP sunucusu oluşturabilir SimpleHTTPRequestHandlerve istediğiniz başlığı ekleyebilirsiniz.

Bunun için bir dosya simple-cors-http-server.py(veya her neyse) oluşturun ve kullandığınız Python sürümüne bağlı olarak aşağıdaki kodlardan birini içine koyun.

O zaman yapabilirsiniz python simple-cors-http-server.pyve her yanıt için CORS başlığını ayarlayacak olan değiştirilmiş sunucunuzu başlatacaktır.

Üstteki shebang ile, dosyayı yürütülebilir hale getirin ve PATH'inize koyun ve onu kullanarak simple-cors-http-server.pyda çalıştırabilirsiniz .

Python 3 çözümü

Python 3 kullanır SimpleHTTPRequestHandlerve HTTPServergelen http.servermodül sunucusu çalıştırmak:

#!/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 çözümü

Python 2 , sunucuyu çalıştırmak için SimpleHTTPServer.SimpleHTTPRequestHandlerve BaseHTTPServermodülünü kullanır .

#!/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 ve 3 çözümü

Hem Python 3 hem de Python 2 için uyumluluğa ihtiyacınız varsa, her iki sürümde de çalışan bu çok dilli betiği kullanabilirsiniz. Önce Python 3 konumlarından içe aktarmaya çalışır, aksi takdirde Python 2'ye geri döner:

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

Talimatları takip ettim ama python simple-cors-http-server.py'yi çalıştırarak hata alıyorum: python: 'simple-cors-http-server.py' dosyası açılamıyor: [Errno 2] Böyle bir dosya veya dizinden çıkış yok ....Düşüncesi olan var mı?
MChan

4
@poke Sunucu, 501 Unsupported method ('OPTIONS') ile yanıt veriyor. Python 2.7.6 ile OS X 10.10.1 çalıştırıyorum. Baska öneri? 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

1
@HairOfTheDog SimpleHTTPRequestHandler OPTIONS HTTP yöntemini desteklemez. İsterseniz ekleyebilirsiniz (HTTP sunucuları hakkındaki Python kılavuzunu okuyun); ya da sunucuya bu şekilde erişmeyi deneyemezsiniz.
dürtmek

2
@RobertoFranceschini Yöntemin doğru şekilde uygulanmasını gerektiren önceden kontrol edilmiş isteklerle karşılaşıyor olabilirsiniz OPTIONS. Basit isteklere gelince, sadece Access-Control-Allow-Originbaşlığı gönderme çözümü yine de iyi çalışmalıdır.
dürtmek

1
@ Tyguy7 Yine de basit HTTP sunucusuyla genel bir davranış olabilir. Daha önce performansla ilgili farklı sonuçlar aldım. Ancak bir anlığına basitçe bir sunucu çalıştırmak için, yine de en hızlı çözüm olduğunu düşünüyorum.
dürtmek

108

Http-server gibi bir alternatif deneyin

SimpleHTTPServer gerçekten üretime yerleştirdiğiniz türden bir sunucu olmadığından, dosyalarınızı http://localhost:3000basit bir Komut satırı

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

#run
http-server -p 3000 --cors

HTTPS'ye mi ihtiyacınız var?

Yerel olarak https'ye ihtiyacınız varsa caddy veya certbot'u da deneyebilirsiniz.


Yararlı bulabileceğiniz bazı ilgili araçlar

  • ngrok : Çalışırken ngrok http 3000, https://$random.ngrok.comherhangi birinin http://localhost:3000sunucunuza erişmesine izin veren bir url oluşturur . Bilgisayarınızda yerel olarak neyin çalıştığını dünyaya gösterebilir (yerel arka uçlar / apiler dahil)

  • localtunnel : neredeyse ngrok ile aynı

  • şimdi : çalışırken now, statik varlıklarınızı çevrimiçi olarak yükler ve dağıtır https://$random.now.sh. Siz aksine karar vermedikçe sonsuza kadar çevrimiçi kalırlar. Farklılık sayesinde dağıtım hızlıdır (ilki hariç). Artık üretim ön uç / SPA kod dağıtımı için uygundur. Docker ve NodeJS uygulamalarını da dağıtabilir. Gerçekten ücretsiz değil, ancak ücretsiz bir planları var.


5
Ben basit bir adamım. Sadece npmsahip olduğu bilinen bir makineye kurulum gerektiren bir çözüm görüyorum python, oy veriyorum.
Parthian Shot

6
@ParthianShot: İş için en iyi aracı kullanmayı öğrenmek isteyebilirsiniz.
Dan Dascalescu

2
@ParthianShot Pek çok geliştiricinin halihazırda kurulu node / npm var. Ve soru başlığı python veya SimpleHTTPServer'ı açıkça umursamayan geniş bir kullanıcı kitlesini yönlendirecek kadar geneldir, bu da olumlu oylarla onaylanmıştır. Bunun herkes için olması size yardımcı olmadığı için değil. Hem Node'u hem de Python'u sevmemek için iyi nedenler var. Leftpad / bad publish / bad git kullanımı gibi şeyler benim için tamamen alakasız görünüyor.
Sebastien Lorber

5
Ek bir dil ve çerçeve eklemek teknik borç doğurur ve bir ortamın saldırı yüzeyini artırır. "Herhangi bir programlama dilinde ölümcül hatalar yapılabilir" Doğru, ancak JS bunu diğer dillerin çoğundan daha kolay hale getirir. Ve her dilin kendine has kuralları vardır; Ne kadar az dil kullanırsanız, dillerden birine aşina olmayan bir geliştiricinin başka bir dilde hata olmayacak bir hata yapması o kadar az olasıdır.
Part Shot

2
Bu, evin her yerinde yardıma ihtiyaç duyduğunuzda bir çocuğu evlat edinmeye benzer; Yolda çözdüğünden daha fazla sorun yaratır.
Part Shot

1

Aynı sorunu yaşadım ve bu çözüme geldim:

class Handler(SimpleHTTPRequestHandler):
    def send_response(self, *args, **kwargs):
        SimpleHTTPRequestHandler.send_response(self, *args, **kwargs)
        self.send_header('Access-Control-Allow-Origin', '*')

Basitçe, SimpleHTTPRequestHandler'dan miras alan ve yalnızca send_responseyöntemi değiştiren yeni bir sınıf oluşturdum .


0

HEAD işlemlerini desteklemeyi seçerseniz kendi do_GET () (ve do_HEAD () örneklerini sağlamanız gerekir). bunun gibi bir şey:

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

Cevabınız için teşekkürler, ancak hiçbir zaman Python bilgim yok, sadece yukarıda bahsedilen kabuk komut dosyasını Emberjs uygulamalarım için basit bir http sunucusu olarak kullanıyorum. Sadece erişim kontrolü problemiyle çarpıştığında, bu basit http sunucusunda onu etkinleştirmem gerektiğini bulmak için araştırma yaptım. Bu yüzden bazı araştırmalardan sonra ekledim ('CrossOrigin', origins => '*'; etkinleştirin) ama şaşırtıcı olmayan bir şekilde işe yaramadı. Lütfen beni çok takdir edilecek erişim kontrol özelliğini içeren herhangi bir Python basit http sunucusu kabuk komut dosyasına yönlendirebilirseniz
MChan

Küçük bir kayda göre, burada gerçekten tembel olmaya çalışmıyorum ama sadece bu özelliği basitHTTP sunucusuna eklemek için python öğrenmeye başlayın bu noktada mantıklı gelmiyor, bu yüzden eklemenin kolay olacağını umuyordum VEYA umarım bulabilirim geliştirme çalışmalarıma devam edebilmem için işi yapabilen alternatif / hazır bir Python betiği
MChan

3
SimpleHTTPServer, erişim denetimlerini destekleme seçeneğine sahip değildir. Ya kendi kodunuzu oluşturmanız ya da erişim kontrollerini destekleyen başka bir web sunucusuna geçmeniz gerekecek. Düşün lighttpd.net
user590028
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.