단순 HTTP 서버에서 액세스 제어 사용


121

매우 간단한 HTTP 서버에 대한 다음 셸 스크립트가 있습니다.

#!/bin/sh

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

이 서버 와 같은 CORS 헤더를 어떻게 활성화하거나 추가 할 수 있는지 궁금 Access-Control-Allow-Origin: *합니다.

답변:


197

안타깝게도 간단한 HTTP 서버는 특히 보내는 헤더가 아닌 사용자 정의를 허용하지 않을 정도로 간단합니다. 그러나 대부분의을 사용하여 간단한 HTTP 서버를 직접 만들고 SimpleHTTPRequestHandler원하는 헤더를 추가 할 수 있습니다.

이를 위해 파일 simple-cors-http-server.py(또는 기타)을 만들고 사용중인 Python 버전에 따라 다음 코드 중 하나를 내부에 넣으십시오.

그런 다음 할 수 있으며 python simple-cors-http-server.py모든 응답에 대해 CORS 헤더를 설정하는 수정 된 서버를 시작합니다.

으로 오두막 상단의 파일을 실행하고 사용자의 PATH에 넣어, 당신은 단지 사용하여 실행할 수 있습니다 simple-cors-http-server.py도.

Python 3 솔루션

파이썬 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 솔루션

Python 2는 SimpleHTTPServer.SimpleHTTPRequestHandlerBaseHTTPServer모듈 을 사용 하여 서버를 실행합니다.

#!/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 솔루션

Python 3과 Python 2 모두에 대한 호환성이 필요한 경우 두 버전 모두에서 작동하는이 polyglot 스크립트를 사용할 수 있습니다. 먼저 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)

지침을 따랐지만 python simple-cors-http-server.py를 실행하면 오류가 발생합니다. python : ca n't open file 'simple-cors-http-server.py': [Errno 2] No such file or directory logout ....이견있는 사람?
MChan

4
@poke 서버는 501 Unsupported method ( 'OPTIONS')로 응답합니다. Python 2.7.6과 함께 OS X 10.10.1을 실행하고 있습니다. 어떤 제안? 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 메서드를 지원하지 않습니다. 원하는 경우 추가 할 수 있습니다 (HTTP 서버에 대한 Python 설명서 참조). 또는 그렇게 서버에 액세스하려고 할 수 없습니다.
찌르기

2
@RobertoFranceschini 메서드를 올바르게 구현 해야하는 프리 플라이트 요청 이 발생할 수 있습니다 OPTIONS. 간단한 요청의 경우 Access-Control-Allow-Origin헤더 만 보내는 솔루션 은 여전히 ​​잘 작동합니다.
찌르기

1
@ Tyguy7 간단한 HTTP 서버에서는 일반적인 동작 일 수 있습니다. 나는 이전에 성능과 관련하여 다양한 결과를 얻었습니다. 그러나 단순히 잠시 서버를 실행하기 위해서는 여전히 가장 빠른 솔루션이라고 생각합니다.
찌를

108

http-server와 같은 대안을 시도하십시오.

SimpleHTTPServer는 실제로 프로덕션에 배포하는 종류의 서버가 아니기 때문에 http://localhost:3000CORS 헤더로 파일을 간단하게 노출하는 작업을 수행하는 한 사용하는 도구에 대해별로 신경 쓰지 않는다고 가정 합니다. 명령 줄

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

#run
http-server -p 3000 --cors

HTTPS가 필요하십니까?

로컬에서 https가 필요한 경우 캐디 또는 certbot을


유용 할 수있는 관련 도구

  • ngrok : 실행할 때 누구나 액세스 할 수 ngrok http 3000있는 URL https://$random.ngrok.com을 생성 합니다.http://localhost:3000 서버 합니다. 컴퓨터에서 로컬로 실행되는 항목 (로컬 백엔드 / api 포함)을 세상에 노출 할 수 있습니다.

  • 지역 터널 : 와 거의 동일

  • now : 실행할 때 now정적 자산을 온라인으로 업로드하고 https://$random.now.sh. 달리 결정하지 않는 한 영원히 온라인 상태로 유지됩니다. diffing 덕분에 배포가 빠릅니다 (첫 번째 제외). 이제 프로덕션 프런트 엔드 / SPA 코드 배포에 적합합니다. Docker 및 NodeJS 앱도 배포 할 수 있습니다. 실제로 무료는 아니지만 무료 계획이 있습니다.


5
나는 단순한 사람입니다. npm를 가지고있는 것으로 만 알려진 시스템에 설치해야하는 솔루션을 발견했습니다 python.
Parthian Shot

6
@ParthianShot : 작업에 가장 적합한 도구를 사용하는 방법을 배우고 싶을 수 있습니다.
Dan Dascalescu

2
@ParthianShot 많은 개발자가 이미 node / npm을 설치했으며 질문 제목은 upvotes에 의해 확인 된 Python 또는 SimpleHTTPServer에 대해 분명히 관심이없는 많은 사용자를 유도하기에 충분히 일반적입니다. 모두에게 도움이되지 않기 때문이 아닙니다. Node와 Python을 모두 좋아하지 않는 데는 좋은 이유가 있습니다. leftpad / bad publish / bad git 사용과 같은 것은 전혀 관련이없는 것 같습니다.
Sebastien Lorber

5
추가 언어와 프레임 워크를 추가하는 것은 기술적 부채를 초래 하고 환경의 공격 표면을 증가시킨다. "모든 프로그래밍 언어에서 치명적인 실수를 할 수 있습니다."사실이지만 JS는 대부분의 다른 언어보다 그렇게 쉽게 만듭니다. 그리고 모든 언어에는 문제가 있습니다. 사용하는 언어가 적을수록 언어 중 하나에 익숙하지 않은 일부 개발자가 다른 언어에서는 실수가 아닌 실수를 할 가능성이 줄어 듭니다.
Parthian Shot

2
이것은 집안에서 도움이 필요할 때마다 아이를 입양하는 것과 같습니다. 앞으로 해결하는 것보다 더 많은 문제를 야기합니다.
Parthian Shot

1

나는 같은 문제가 있었고이 해결책을 찾았습니다.

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

send_response메서드 만 변경하는 SimpleHTTPRequestHandler에서 상속 된 새 클래스를 만들었습니다 .


0

do_GET ()의 고유 한 인스턴스를 제공해야합니다 (그리고 HEAD 작업을 지원하도록 선택한 경우 do_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()

답변 해 주셔서 감사합니다.하지만 저는 Python에 대한 지식이 전혀 없습니다. 위에서 언급 한 쉘 스크립트를 Emberjs 앱의 간단한 http 서버로 사용하고 있습니다. 액세스 제어 문제와 충돌했을 때만이 간단한 http 서버에서 활성화해야한다는 것을 알아 냈습니다. 그래서 몇 가지 연구 후에 추가했지만 ( 'CrossOrigin', origins => '*'; 활성화) 놀랍게도 작동하지 않았습니다. 높이 평가 될 액세스 제어 기능이 포함 된 Python의 간단한 http 서버 셸 스크립트를 알려 주시면 감사하겠습니다.
MChan

사소한 메모로, 저는 여기서 게으르지 않고 Python을 배우기 시작하여이 기능을 simpleHTTP 서버에 추가하는 것이이 시점에서 논리적으로 들리지 않으므로 쉽게 추가하거나 찾을 수 있기를 바랐습니다. 개발 작업을 계속할 수 있도록 작업을 수행 할 수있는 대체 / 준비된 Python 스크립트
MChan

3
SimpleHTTPServer에는 액세스 제어를 지원하는 옵션이 없습니다. 자신의 코드를 롤링하거나 액세스 제어를 지원하는 다른 웹 서버로 전환해야합니다. 생각해 lighttpd.net
user590028
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.