Python で URL を転送する備忘録

Server
Photo by hyt.

Python で URL を転送する方法についての備忘録です.動機は

URL の転送のためだけに Apache を入れる(設定する)のは大袈裟だよなぁ….何とかならないかなぁ…

ということで,最近の標準的な UNIX(Linux) のパッケージだと最小構成でも python くらいは入っているので,じゃあ python で実現してみようと思ったわけです.

Python: HTTP サーバーをつくる
Python: HTTP サーバーをつくる Python: JSON を返す HTTP サーバーをつくる Python: socket モジュールを使って JSON を返す HTTPS サーバーをつくる 静的なファイルに限定するのであれば、...

を参考に,結果は以下となりました.

http の場合

まずは http 版のスクリプトから.python3 系列を意識した書き方ですが,python2系列でも大丈夫なはずです.

#!/usr/bin/python3
from wsgiref.simple_server import make_server

HOST=""
PORT=80

def simple_app(environ, start_response):

  body = b'''
    <html>
      <head>
        <meta http-equiv="refresh" content="0;URL=http://****.*****.**.**/">
      </head>
    </html>'''

  status = '200 OK'
  headers = [
    ('Content-Type', 'text/html; charset=utf-8'),
    ('Content-Length', str(len(body)))
  ]
  start_response(status, headers)

  return [body]

httpd = make_server(HOST, PORT, simple_app)

#print("serving at port", PORT)
httpd.serve_forever()

上のスクリプトの「http://****.*****.**.**」の部分に転送先の URL を記します.また,「HOST=””」を「HOST=”192.168.1.1″」などとすれば,特定のネットワークアダプタ等でHOSTする,つまり,192.168.1.1 で転送待ち受けを行うことになります.

ただし,1024以下のポートを使いますので,python に適当な権限を与えるか,root で実行する必要があります.私の場合は面倒なので(内部サーバー用ですし)/etc/rc.local に次のような行を追加しています(スクリプト名を httpforwarding.py としています).

/usr/bin/python3 /usr/local/bin/httpforwarding.py 2> /dev/null &

https の場合

https (SSL) 版だと次の通りです.

#!/usr/bin/python3
from wsgiref.simple_server import make_server
import ssl

HOST=""
PORT=443

def simple_app(environ, start_response):

  body = b'''
    <html>
      <head>
        <meta http-equiv="refresh" content="0;URL=http://****.*****.**.**/">
      </head>
    </html>'''

  status = '200 OK'
  headers = [
    ('Content-Type', 'text/html; charset=utf-8'),
    ('Content-Length', str(len(body)))
  ]
  start_response(status, headers)

  return [body]

httpd = make_server(HOST, PORT, simple_app)
httpd.socket = ssl.wrap_socket(httpd.socket,
        server_side=True,
        keyfile = "/home/****/ssl/private.pem",
        certfile = "/home/****/ssl/cert.pem")

#print("serving at port", PORT)
httpd.serve_forever()

ここで,private.pem は秘密鍵,cert.pem は署名付き証明書ですね.http の場合と同様に 1024以下のポート番号ですので,root で実行するか,python に適当な権限を与える必要があります.

見ての通り非常に簡単ですが,apache 等をインストールして適当に設定するよりは簡単なんじゃないかなぁと思うのですが如何でしょうか?

Server
スポンサーリンク
Following hyt!
hyt adversaria
タイトルとURLをコピーしました