Wednesday, February 20, 2013

Alias よりも Location が優先する

ささいな話です. Apache HTTP Server の設定において, AliasLocation のどちらが優先するか, という話です.

とりあえず, Apache HTTP Server と PHP-FPM とを先月の記事に書いたような感じで連携させ, PHP-FPM としては /xxx に chroot していることを前提といたします.

ここで, Apache HTTP Server 側で, たとえば次のように設定したとします.

    AliasMatch ^/zzz/(.*\.php)$ /zzz/$1
    <LocationMatch ^/zzz/(.*\.php)$>
        ProxyPassMatch fcgi://127.0.0.1:9000/zzz/$1
    <LocationMatch>

クライアント PC から /zzz/hello.php にアクセスすると, /xxx/zzz/hello.php の内容が PHP のプロセッサーによって処理されたうえで返ってきます.

次に, Apache HTTP Server 側で, 次のように設定したとします.

    <LocationMatch ^/zzz/(.*\.php)$>
        ProxyPassMatch fcgi://127.0.0.1:9000/zzz/$1
    <LocationMatch>
    AliasMatch ^/zzz/(.*\.php)$ /zzz/$1

先ほどとは順番を変えただけです. この場合, クライアント PC から /zzz/hello.php にアクセスしても, やはり先ほどと同じように /xxx/zzz/hello.php の内容が PHP のプロセッサーによって処理されたうえで返ってきます.

では, いっそのこと, 次のように設定したらどうなるでしょうか.

#    <LocationMatch ^/zzz/(.*\.php)$>
#        ProxyPassMatch fcgi://127.0.0.1:9000/zzz/$1
#    <LocationMatch>
    AliasMatch ^/zzz/(.*\.php)$ /zzz/$1

この場合, クライアント PC から /zzz/hello.php にアクセスしてみますと, 今度は /zzz/hello.php の内容が返ってきます. したがって, 当然 PHP のプロセッサーによって処理されることもなく, そのまま返ってきます.

要するに, AliasLocation の間では, 設定ファイルへの記載順序にかかわらず, 常に Location のほうが Alias よりも優先するようです.

ちょっとしたコツをつかんだ気がして, 少し得意になっていましたところ, 何のことはない, オンラインドキュメントにしっかり書かれていました.

Note that you may need to specify additional <Directory> sections which cover the destination of aliases. Aliasing occurs before <Directory> sections are checked, so only the destination of aliases are affected. (Note however <Location> sections are run through once before aliases are performed, so they will apply.)

mod_alias - Apache HTTP Server

括弧の中に書かれた部分に注目です. つまり, AliasLocation よりは後に適用される, ということです.

勉強になりました.

No comments:

Post a Comment