apacheのaliasが効かなくて悩む
Apacheのaliasが思うように効かなくて悩んだ話し。
httpリクエストをapacheで受けて、受けたリクエストをすべてバックエンドのアプリケーションサーバへ流すような設定をしていました。
<VirtualHost hoge.exapmpel.com:80> (前略) <IfModule mod_proxy.c> ProxyPass / app_server.example.com ProxyPassReverse / app_server.example.com </IfModule>
ところが一部URIのみはバックエンドのアプリケーションサーバが吐き出すファイルをapacheからも参照して、そちらを静的ファイルとして見えるようにしました。
そのファイルが存在するディレクトリをalias設定。バックエンドが画像ファイルを/var/tmp/imagesに吐き出すので、こんな設定をいれました。
<VirtualHost hoge.exapmpel.com:80> Alias /images /var/tmp/images <IfModule mod_proxy.c> ProxyPass / app_server.example.com ProxyPassReverse / app_server.example.com </IfModule>
ところが、http://hoge.example.com/images/fuga.jpg などにリクエストを出しても404が帰ってくる。なぜだ。
しばらく悩んだあと、この404はバックエンド側が出していることに気が付きました。そうか。aliasしたところで、上記設定だとすべてのリクエストがバックエンドへいくので、当該URIがなければ404を返すのは当然。
ってことでこうして解決。
<VirtualHost hoge.exapmpel.com:80> Alias /images /var/tmp/images <IfModule mod_proxy.c> ProxyPass /images ! ProxyPass / app_server.example.com ProxyPassReverse / app_server.example.com </IfModule>
とここまで書いたところで、apache1.3ではProxyPass ... ! という構文がなかったことを思い出しました。10年前のエントリにちゃんと書いてあるなぁ。