2&>1

AWSとかGCPとかGolangとかとか

Apacheのリバースプロキシしたお話

問題

ウェブサイトで一部リンクを別サーバに立ててるコンテンツを表示したい要件があり。

ドメインリンク元ドメインにしたいのでリバースプロキシで対応することにしたお話です。

リバースプロキシしたコンテンツ内の更にリンクへ遷移するともともとのドメインが表示されちゃうので

どうしてやろうと四苦八苦したお話でもあります。

解答

これ必要 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の変換が行えない場合に補完する役割で使用し、JavaScriptCSS 等のコンテンツに対しても 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の変換を行うために設定

まとめ

リバースプロキシってそこそこ使うけどちゃんと知ってなかったのでよい機会でした