問題
ウェブサイトで一部リンクを別サーバに立ててるコンテンツを表示したい要件があり。
ドメインはリンク元のドメインにしたいのでリバースプロキシで対応することにしたお話です。
リバースプロキシしたコンテンツ内の更にリンクへ遷移するともともとのドメインが表示されちゃうので
どうしてやろうと四苦八苦したお話でもあります。
解答
これ必要
yum install mod_proxy_html
このようにhttp.confをすることでリバースプロキシ先のリンクURLのドメインも統一することができました。
<VirtualHost *:80> ServerName www.hoge.jp ProxyHTMLLinks a href ProxyHTMLLinks area href ProxyHTMLLinks link href ProxyHTMLLinks img src longdesc usemap ProxyHTMLLinks object classid codebase data usemap ProxyHTMLLinks q cite ProxyHTMLLinks blockquote cite ProxyHTMLLinks ins cite ProxyHTMLLinks del cite ProxyHTMLLinks form action ProxyHTMLLinks input src usemap ProxyHTMLLinks head profile ProxyHTMLLinks base href ProxyHTMLLinks script src for ProxyPass / http://fugafuga.com/ <Location /> RequestHeader unset Accept-Language FilterProvider iconv xml2enc "%{CONTENT_TYPE} =~ m|^text/html|" FilterProvider proxyhtml proxy-html "%{CONTENT_TYPE} =~ m|^text/html|" FilterProvider SUBSTITUTE SUBSTITUTE "%{CONTENT_TYPE} =~ m|^text/html|" FilterProvider SUBSTITUTE SUBSTITUTE "%{CONTENT_TYPE} =~ m|^text/css|" FilterProvider SUBSTITUTE SUBSTITUTE "%{CONTENT_TYPE} =~ m|^text/javascript|" FilterProvider SUBSTITUTE SUBSTITUTE "%{CONTENT_TYPE} =~ m|^application/javascript|" FilterChain SUBSTITUTE iconv proxyhtml ProxyPassReverse http://fugafuga.com/ ProxyPassReverseCookieDomain fugafuga.com www.hoge.jp ProxyPassReverseCookiePath / / SetOutputFilter INFLATE ProxyHTMLCharsetOut * ProxyHTMLURLMap ^/([^/])|^/$ /$1 R Substitute 's|//fugafuga.com/|//www.hoge.jp/|n' </Location> </VirtualHost>
解説
上で何してるかっていうと 「www.hoge.jp」へアクセスするとURLはそのままにコンテンツは「fugafuga.com」を表示させてます。
fugafuga.com/のリンクをクリックすると「www.hoge.jp/link1」とブラウザ的には表示して欲しかったのが「www.hoge.jp/link1」となり置き換わらないとこで躓いてました。
そこの置き換えをしているのが
その前に
・ProxyHTMLLinkで
RL変換を行うHTMLタグの指定を行っています
・RequestHeader unset Accept-Language
アプリケーションの応答コンテンツで「コンテンツ圧縮」が行われないようにするためにリクエストHTTPヘッダーから削除しています。アプリケーションからの応答コンテンツがコンテンツ圧縮されてしまうとバイナリデータであるためにmod_proxy_htmlやmod_substituteによるURLの変換が行えないためです。
・FilterProviderとFilterChain
Apacheのinputフィルタに関する設定を行っています。対象のフィルター以下
→mod_proxy_html
HTMLコンテンツのみに対してURLの変換を行うため、Content-Type が text/html のみ動作する設定
→mod_substitute
mod_proxy_htmlでURLの変換が行えない場合に補完する役割で使用し、JavaScript や CSS 等のコンテンツに対しても URL の変換を行います。 のため、これらのContent-Type を設定しています。環境によっては他にもxmlファイル等必要な Content-Typeを設定する必要あり
→mod_xml2enc
mod_proxy_html と同様
・FilterChain
mod_substitute→mod_xml2enc→mod_proxy_html の順番でフィルタが動作するように設定
プロキシするための設定が以下
・ProxyPass
表示するURL
・ProxyPassReverse
アプリケーションが応答するLocationヘッダーの書き換え設定
・ProxyPassReverseCookiePath
アプリケーションが発行するSet-CookieヘッダーのPath属性の書き換え設定
・SetOutputFilter
圧縮レスポンスを解答する設定
・ProxyHTMLCharsetOut
URLの変換後の文字エンコーディングの指定の設定。*と設定することで、mod_proxy_htmlで URL の変換を行った後で元のコンテンツと同じ文字エンコーディングに戻す。ないとUTF-8となり文字化けする
・ProxyHTMLURLMap
URLの変換ルールを設定(正規表現)
・Substitute
mod_proxy_htmlで変換できない箇所のURLの変換を行うために設定
まとめ
リバースプロキシってそこそこ使うけどちゃんと知ってなかったのでよい機会でした