単純な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ソリューション

Pythonの3つの用途SimpleHTTPRequestHandlerHTTPServerから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.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ソリューション

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)

手順に従いましたが、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 2014

4
@pokeサーバーは501 Unsupported method( 'OPTIONS')で応答します。OS X 10.10.1とPython 2.7.6を実行しています。助言がありますか? 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 2015年

1
@HairOfTheDog SimpleHTTPRequestHandlerはOPTIONS HTTPメソッドをサポートしていません。必要に応じて追加できます(HTTPサーバーに関するPythonのマニュアルを参照してください)。または、そのようなサーバーにアクセスすることはできません。
2015年

2
@RobertoFranceschini メソッドを適切に実装する必要があるプリフライトリクエストに遭遇している可能性がありOPTIONSます。単純なリクエストについては、Access-Control-Allow-Originヘッダーのみを送信するソリューションでも問題なく機能します。
突く

1
@ Tyguy7それは単純なHTTPサーバーでの一般的な振る舞いかもしれません。以前、パフォーマンスに関してさまざまな結果がありました。しかし、サーバーをしばらく実行するだけの場合でも、私はそれが最も速い解決策だと考えています。
突く

108

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が必要な場合は、キャディまたはcertbotを試すこともできます


役立つと思われるいくつかの関連ツール

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

  • localtunnelngrokとほぼ同じ

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


5
私は単純な男です。npm持っていることがわかっているだけのマシンにインストールする必要がある解決策pythonを見つけました。
パルティアンショット

6
@ParthianShot:仕事に最適なツールの使い方を学びたいと思うかもしれません。
Dan Dascalescu、2018

2
@ParthianShot多くの開発者はすでにnode / npmをインストールしています。質問のタイトルは、PythonやSimpleHTTPServerを明らかに気にしない大勢のユーザーを駆動するのに十分一般的であり、賛成投票によって確認されます。みんなのためにあるのはあなたにとって役に立たないからではありません。NodeとPythonの両方が好きではないのには、十分な理由があります。leftpad / bad publish / bad git usageのようなことは、私にはまったく関係がないようです。
Sebastien Lorber

5
追加の言語やフレームワークを追加すると、技術的負債を負う環境の攻撃面を増加します。「致命的なミスはどのプログラミング言語でも起こり得ます」真実ですが、JSは他のほとんどの言語よりもその方法を簡単にします。そして、すべての言語には問題があります。使用する言語が少ないほど、言語の1つに慣れていない開発者が、別の言語では間違いではない間違いを犯す可能性は低くなります。
パルティアンショット

2
これは、家の周りで助けが必要になるたびに子供を養子にするようなものです。将来解決するよりも多くの問題が発生します。
パルティアンショット

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サーバーシェルスクリプトを
紹介してください

マイナーなメモとして、私はここで本当に怠惰にしようとはしていませんが、simpleHTTPサーバーにこの機能を追加するためだけにpythonの学習を開始することは、現時点では論理的に聞こえないので、簡単に追加できることを願っています。私の
開発

3
SimpleHTTPServerには、アクセス制御をサポートするオプションはありません。独自のコードをロールするか、アクセス制御をサポートする別のWebサーバーに切り替える必要があります。lighttpd.net
user590028
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.