mod_xsendfile /教訓w

この記事は一年以上前の記事です。

今更ですがmod_xsendfileにお世話になりました。
んでもって・・しょうもないところでつまずいたw
(プログラム関連記事にするまでもないのでこちらに書きます)

画像などのメディアファイルをサイトで扱う際、
プライベートなデータであったり、企業で扱うデータである場合なら当然閲覧制限を設けておくべきだと思います。(当たり前かw)
しかしサーバーにアップロードして、それを表示するだけの仕組みだと、URL直打ちされるとファイルを見れちゃうんです。

例えばこちらのリンクは、私がアルバム公開範囲を自分だけに制限している画像の画像ファイルへの直リンクですが、アクセスしてみると見れますよね?
https://lh6.googleusercontent.com/-I63BJH0jTXo/UA5K_IX786I/AAAAAAAA6uc/MgaoTExXLQA/s1152/Haikyo_001.jpg

こういった事態をクライアントのWEBアプリで発生させられないので、Apacheのモジュール”mod_xsendfile for Apache2/Apache2.2“の出番です。

mod_xsendfileを使うと、
サーバーへのアクセス(ファイルへの直リンク等)–>>自作モジュール–>>サーバーのファイル表示
といった具合に、サーバーファイルを表示させる前に認証処理等のプログラムを挟む事が出来ます。

今回行った事の概要
(VPS/CentOS && Apache2.2 && Django1.4 && Python2.7)

  • mod_xsendfileのインストールする。(説明は不要なので省きます。)
  • Apache のconfigファイル(サーバー構造によって場所は違うと思います。)にて、
    XSendFile on
    XSendFilePath /path/to/upload/directory

    を記述する。

  • 今回はDjangoなのでDjango設定ファイル”setting.py”に
    MEDIA_ROOT = '/full/path/to/upload/directory/'

    を記述しておく。

  • ファイルへのアクセスに対して処理するモジュールを呼び出す。
    今回はDjangoなので”urls.py”に

    url(r'^privatefiles/(?P<path>.*)$', privatefile_xsendfile, {'document_root': settings.MEDIA_ROOT}),

    を記述する。

  • privatefile_xsendfileを記述する。
    今回はprivatefiles/fileview.pyにて、(def privatefile_xsendfile内に)自作ユーザー認証プログラムを書いた後で

    response = HttpResponse()
    del response['content-type']
    response['X-Sendfile'] = (os.path.join(document_root, path)).encode('utf-8')

    を記述する。
    ここでユーザーでない場合等のレスポンスも指定できますね^^

  • Apacheサーバー再起動

今回はほとんど変更作業は終わっているはずなのに、どうしてもファイルが表示されなかった。
色々悩んでみたけれど、どうしても分からない・・。
仕方が無いので、X-SendFileに渡すファイルパスをテキストにして出力させてみて、
本来のパスと見比べてみた。
・・ほとんど同じようだけど、全体の長さが数ミリ違う・・よ〜く目を凝らして見てみると、文字が一つ異なってるw
正確にはsetting.pyにて設定したMEDIA_ROOTの絶対パスの記述が一文字間違ってた。。
しょ〜もない。。
二時間ほど悩んだ結果が、アルファベット一文字の間違いだとは・・。
”正解のハズなのにハマったらルートに戻れ”とはこの事ですね、ハイ。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください