web-dev-qa-db-ja.com

単純なHTTPサーバーでアクセス制御を有効にする

非常に単純なHTTPサーバー用の次のシェルスクリプトがあります。

#!/bin/sh

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

このサーバーにAccess-Control-Allow-Origin: *のようなCORSヘッダーを有効化または追加する方法を疑問に思っていましたか?

99
MChan

残念ながら、単純なHTTPサーバーは本当に単純なので、特に送信するヘッダーはカスタマイズできません。ただし、ほとんどのSimpleHTTPRequestHandlerを使用して簡単なHTTPサーバーを自分で作成し、必要なヘッダーを追加するだけです。

そのためには、ファイルsimple-cors-http-server.py(または何でも)を作成し、使用しているPythonバージョンに応じて、次のコードのいずれかを内部に配置します。

その後、python simple-cors-http-server.pyを実行すると、変更されたサーバーが起動され、応答ごとにCORSヘッダーが設定されます。

Shebang を先頭にして、ファイルを実行可能にしてPATHに入れると、simple-cors-http-server.pyを使用して実行することもできます。

Python 3ソリューション

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 __== '__main__':
    test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)

Python 2ソリューション

Python 2は SimpleHTTPServer.SimpleHTTPRequestHandlerBaseHTTPServer module を使用してサーバーを実行します。

#!/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 __== '__main__':
    BaseHTTPServer.test(CORSRequestHandler, BaseHTTPServer.HTTPServer)

Python 2および3ソリューション

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 __== '__main__':
    test(CORSRequestHandler, HTTPServer)
158
poke

http-serverのような代替手段を試してください

SimpleHTTPServerは実際に運用環境に展開する種類のサーバーではないので、ここでhttp://localhost:3000でファイルを公開するジョブを実行する限り、使用するツールについてそれほど気にしないと仮定しています単純なコマンドラインのCORSヘッダー

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

#run
http-server -p 3000 --cors

HTTPSが必要ですか?

ローカルでhttpsが必要な場合は、 caddy または certbot を試すこともできます


便利だと思うかもしれないいくつかの関連ツール

  • ngrokngrok http 3000を実行すると、誰でもhttps://$random.ngrok.comサーバーにアクセスできるURL http://localhost:3000を作成します。コンピューターでローカルに実行されているもの(ローカルバックエンド/ APIを含む)を世界に公開できます。

  • localtunnel :ngrokとほぼ同じ

  • nownowを実行すると、静的アセットがオンラインでアップロードされ、https://$random.now.shにデプロイされます。別の方法で決定しない限り、それらは永遠にオンラインのままです。差分のおかげで、展開は高速です(最初のものを除く)。現在、本番環境のフロントエンド/ SPAコードの展開に適しています。DockerおよびNodeJSアプリも展開できます。それは本当に無料ではありませんが、彼らは無料のプランを持っています。

90

私は同じ問題を抱えていて、この解決策に来ました:

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
Hugo Trentesaux