ProxyPassReverseにajp://~と書くのは間違い

【やらかしてたこと】
Apache HTTP Server(以後httpd)の後ろにTomcatを配置して処理を行っている。
そのため、proxy.confに以下の様に記載していた。

ProxyPass /hoge ajp://localhost:8009/hoge
ProxyPassReverse /hoge ajp://localhost:8009/hoge

ProxyPassReverseは、上記の記述では何も動かないただのおまじないだとようやく気付いた。

【ProxyPasReverseディレクティブ】
[マニュアル]
http://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxypassreverse

[文法]

ProxyPassReverse path url

[機能概要]
httpdの後ろにTomcatがいる構成でTomcatがリダイレクト用レスポンスを返却する際、クライアントが直接Tomcatにアクセスさせない様に(必要であれば)調整するための機能である。
なお、ProxyPassは、httpd経由でTomcatにアクセスする際のURLを書き換えるための機能である。

f:id:yoneyore:20210324001859p:plain
リダイレクトの際もhttpdを経由して欲しいのにそうなってくれない場合に利用するディレクティブ

[挙動から理解した仕様]
・リダイレクトさせるためのレスポンスを返す際のLocationヘッダーを編集する。
・ProxyPassは、リクエストを書き換える機能のため、pathをurlに置換する。
 ProxyPassReverseは、レスポンスを書き換える機能のため、urlをpathに置換する。
・やっていることはLocationヘッダーに対して、文字列置換を行っているにすぎない。
 論理情報(url, ポート番号, コンテキスト名, プロトコル, etc...)は一切解釈してなさそう。
・urlは相対パスでも絶対パスでもどちらでも良い。
 但し、先頭一致はしている必要が有る(部分一致で置換はしていなさそう)。
・pathも相対パスでも絶対パスでもどちらでも作用した。
 (使い方として正しいかどうか分からないが、現時点では動く事は確認済)
Cookieを用いている場合は、Cookie側も想定通りか確認しておく必要がある。
 書き換えが必要な場合は、ProxyPassReverseCookieDomainやProxyPassReverseCookiePathを用いる。
・Locationディレクティブを用いて記述する事も可能である。

<Location "/hoge">
ProxyPass ajp://localhost:8009/hoge
ProxyPassReverse /hoge
</Location>

 但し、Locationディレクティブでは表現しにくい場合がある。
 その場合は、Locationディレクティブで無理にくくろうとせずに記述した方が良い。

【ProxyPasReverseディレクティブの具体例】
実際は個々のリクエストでなく、色々なリクエストを気にしないといけないので、下記例が実際に必要になることはないだろうが、ProxyPassReverseの理解を行う際の一助のために記載する。

[例1]
https://example.jp/hoge1/topにアクセスし、リダイレクトに/hoge1/menu1と返却する。
proxy.confに以下の様に記述しておいたとする。

ProxyPass / ajp://localhost:8009/
ProxyPassReverse /manager /hoge1/me

この場合、リダイレクトする際のURLは、https://example.jp/managernu1となる。

[例2]
https://example1.jp/hoge1/topにアクセスし、リダイレクトにhttps://example1.jp/hoge1/menu1と返却する。
proxy.confに以下の様に記述しておいたとする。

ProxyPass / ajp://localhost:8009/
ProxyPassReverse http://example2.jp/hoge2/menu2 https://example1.jp/hoge1/menu1

この場合、リダイレクトする際のURLは、http://example2.jp/hoge2/menu2となる。

【使いどころ】
・レスポンスのLocationがTomcatのホスト名を含めた絶対パスを返却してしまう場合
・レスポンスのLocationがdockerなど仮想環境のホスト名、ポート番号を返却し都合が悪い場合
・レスポンスのLocationがTomcat内の外部には公開していないパスも含めた相対パスで返却してしまう場合

【その他】
・必要の無い場合は、書かなくても良いディレクティブ
・現時点でProxyPassReverse ~ ajp:// ~ と書いてたら削っても問題ないはず
 (実際は怖くてすぐ消せないけど…)

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

  • 作者:鶴長 鎮一
  • 発売日: 2012/03/23
  • メディア: 単行本(ソフトカバー)
詳解 Tomcat

詳解 Tomcat