Revers Proxy for Canon製ネットワークカメラ

グローバルIPアドレスが1個しか割り当てられず、80番以外の特殊ポートで動作しているCanon製ネットワークカメラを、ApacheのRevers Proxyを使って、Apacheのサブディレクトリ配下にあるように見せる方法を検証しました。

<IfModule mod_proxy.c>
    # 1台目のネットワークカメラのリバースプロキシ設定(1つ目が行き、2つ目が戻り)
    ProxyPass /live/cam1/ http://<!-- ネットワークカメラのホスト名 -->:10081/
    ProxyPassReverse /live/cam1/ http://<!-- ネットワークカメラのホスト名 -->:10081/

    # 2台目のネットワークカメラのリバースプロキシ設定(1つ目が行き、2つ目が戻り)
    ProxyPass /live/cam2/ http://<!-- ネットワークカメラのホスト名 -->:10082/
    ProxyPassReverse /live/cam3/ http://<!-- ネットワークカメラのホスト名 -->:10083/

    # 3台目のネットワークカメラのリバースプロキシ設定(1つ目が行き、2つ目が戻り)
    ProxyPass /live/cam3/ http://<!-- ネットワークカメラのホスト名 -->:10083/
    ProxyPassReverse /live/cam2/ http://<!-- ネットワークカメラのホスト名 -->:10082/
</IfModule>

<IfModule mod_rewrite.c>
    # URL書き換えを有効にする
    RewriteEngine On

    # REFERERをチェックして、1台目のネットワークカメラからのコンテンツURLを書き換える
    RewriteCond %{HTTP_REFERER} ^http://<!-- Webサーバのホスト名 -->/live/cam1/ [NC]
    RewriteRule ^/(viewer|-wvhttp-01-)/(.*)$ /live/cam1/$1/$2 [R,L]

    # REFERERをチェックして、2台目のネットワークカメラからのコンテンツURLを書き換える
    RewriteCond %{HTTP_REFERER} ^http://<!-- Webサーバのホスト名 -->/live/cam2/ [NC]
    RewriteRule ^/(viewer|-wvhttp-01-)/(.*)$ /live/cam2/$1/$2 [R,L]

    # REFERERをチェックして、3台目のネットワークカメラからのコンテンツURLを書き換える
    RewriteCond %{HTTP_REFERER} ^http://<!-- Webサーバのホスト名 -->/live/cam3/ [NC]
    RewriteRule ^/(viewer|-wvhttp-01-)/(.*)$ /live/cam3/$1/$2 [R,L]
</IfModule>

サブディレクトリへのアクセスをネットワークカメラのアドレスに転送することは造作もないことでした。一番難儀したのは、ネットワークカメラから帰ってくるHTMLコンテンツの内容でした。

/viewer/live/ja/~

とか

/-wvhttp-01-/~

というURLのパスが指定されているので、そのまま表示しようとすると”404 not found”エラーにしかなりません。無条件に”/viewer/live/ja/~”や”/-wvhttp-01-/~”を書き換えると、関係のないページのコンテンツまで書き換わってしまう可能性があるため、書き換えは「Refererがネットワークカメラであること」という条件を付け、条件に一致するものについてはパスの先頭にURLを付け足す必要がありました。また、ネットワークカメラは複数台あるので、Refererのアドレスでどのネットワークカメラであるか?を判別して、振り分けしています。

ただ、これもブラウザ側やセキュリティソフトの設定でRefererを返さないようになっていると意図した動きにはならないので、完璧ではないんですよねぇ。