TenForward

技術ブログ。はてなダイアリーから移転しました

Apache HTTP server の mod_proxy_html メモ

最近、結構音楽ブログを更新しています。昔は音楽レビューといえばひたすら言葉でレビューするだけだったのが、最近は動画の埋め込みを行うようになって表現力のない私でも気楽にレビューができるようになってきました。

動画の埋め込みというと YouTube がまず思い浮かびますね。私の音楽ブログでもよく使っています。他に音楽ブログの性格上、V LIVEの動画を埋め込むこともあります。どちらも iframe を使った埋め込みコードが動画ページから生成できますので、気楽に貼り付けられます。

さて、私の音楽ブログは最近常時 SSL 化の流れで Let's Encrypt を使って SSL 化を行いました (Zenlogicの機能を使っただけ!!)。http でアクセスしても https に飛ばされます。https でアクセスするページに YouTube のコードを埋め込むのは何の問題もないのですが、V LIVE は埋め込む URL が http なので https でアクセスするページに埋め込みコードを貼り付けてもブロックされてしまいます。

となると、自分で運用している VPS でリバースプロキシの設定をやって、それを貼り付けたらいいんじゃないか? という考えが思い浮かぶのでやってみました。まあ例えば

ProxyPass "/vlive" "http://www.vlive.tv"
ProxyPassReverse "/vlive" "http://www.vlive.tv"

ってな感じですぐに設定できました。早速喜んで埋め込みコードとして、自 VPS の URL を使ってみましたが、これだと iframe の src に書かれた先を読み込むのは https 化されましたが、その中でさらに呼ばれる js や css が相変わらず http なので、動画はブロックされたままでした。残念...

そこで確かそういう場合に使うモジュールあったよなあと思ってググってみると、proxy 通した場合のコンテンツ内の URL を変換する場合は

  • mod_substitute
  • mod_proxy_html

なんかを使うようですね。

そこでmod_proxy_htmlを試すかということで、mod_proxy_htmlの公式マニュアルを見ながら設定してみました (mod_proxy_html は以前使ったことあるような記憶があったので)。

ProxyHTMLEnable On
ProxyHTMLExtended On
ProxyHTMLURLMap http://www.vlive.tv/ https://www.example.com/

# 以下は mod_proxy_html と一緒にインストールされる proxy-html.conf 内で書かれている設定もあります
ProxyHTMLLinks meta content
ProxyHTMLLinks script src
ProxyHTMLLinks link href
  : (snip)

とするけど、ブラウザでエラーになってしまいます(Chrome だと "ERR_CONTENT_DECODING_FAILED")。うーむ、としばらくいろいろ設定を試したのですがうまくいかずに諦めようかなという時にふと目に付いたのが公式マニュアルのコメント欄

RequestHeader unset Accept-Encoding

これを加えると見事動作しました。マニュアル部分に注釈としてでも書いておいてほしいなー。

SetOutputFilter proxy-html

を設定しろみたいに書いてあるページもいくつか見つけましたが、コメント欄にあるように UTF-8 の部分が文字化けしてしまいますので不要です。

ハマったのでメモ代わりに残しておこうと思ってブログ書いたけど…、ふと今日検索してみると…

こんなページがひっかかった!! (^_^;) mod_substitute でも同じ問題が起きるようですね。なるほど、ブラウザの送るヘッダをそのまま送って圧縮した応答なんかが帰ってきた場合にうまく処理できないってことですか。

なぜハマってる最中にググった時に気づかなかったんだ!? というわけで書くほどでもなかったネタのようですが、せっかく書いたのでそのまま公開しておきます。

せっかく問題は解決したのに、V LIVE で貼り付けようとしていた動画を早速貼り付けようとしたら、YouTube でも公開されていたので、まだ音楽ブログでは活用できてません。