カテゴリー
Linux

Apache の Alias 最大の罠。それは順番!長い URL パスから書くのです!

やりたいこと

ひとつのサイトに複数のエイリアスを設定したい!

具体的に、次を実現したいです。

  • http://example.com/from1/from2/ → /var/www/test/to1/to2/index.html を表示
  • http://example.com/from1/  → /var/www/test/to1/index.html を表示

試しておりましたら、些細なことでハマってしまいましたので、マニュアルを改めまして、整理いたします!

準備

mkdir -p /var/www/test/to1/to2/
echo 'to1 zuwai' > /var/www/test/to1/index.html
echo 'to2 taraba' > /var/www/test/to1/to2/index.html

エイリアス 確認用の設定ファイル

vim /etc/httpd/conf.d/alias_test.conf

エイリアスを両方共有効にできる、よい書き方

Alias /from1/from2 /var/www/test/to1/to2
Alias /from1 /var/www/test/to1

設定を Apache に反映

/etc/init.d/httpd reload

これで、最初の行いたいことが実現できました♪

しかも、「http://example.com/from1/from2/」ではなく「http://example.com/from1/from2」、つまり最後のスラッシュ「/」を省略してリクエストしても、最後のスラッシュを補完してくれることに気が付きました♪

最初のエイリアスだけ有効となって、次は有効にならない、わるい書き方

設定ファイルの順番を入れ替えます。

Alias /from1 /var/www/test/to1
Alias /from1/from2 /var/www/test/to1/to2

なんとこれだけです。

  • http://192.168.56.111/from1/from2/ → 404 Not Found
  • http://192.168.56.111/from1/ → /var/www/test/to1 を表示

と、片方がエラーとなってしまいます><。

Apache のドキュメントを拝見しますと、次のように書かれています。

次に、Alias と Redirect が設定ファイル中の 順番に適用され、最初にマッチしたものが優先されます。

ですから、二つ以上のディレクティブが同じパスに適用されるときは、 すべてのディレクティブの効果を得るためにはより詳しいパスを先に書く 必要があります。

つまり、URL に /from1/from2 を入力しても、最初の設定 /from1 にマッチしてしまうようです。そして、URL の残りの /from2 を、/var/www/test/to1 ディレクトリに無いかどうか探しに行き、無いので 404 Not Found となるのですわね。

エラーログを確認しましても、そのことが見て取れます。

[Mon Nov 11 23:52:09 2013] [error] [client 192.168.56.1] File does not exist: /var/www/test/to1/from2

もう一つ気になったのは、URL パスにも、ファイル・ディレクトリパスにも最後にスラッシュを付けないこと

ここは、ふとした瞬間に迷ってしまうことが何度かあると存じます。忘れても思い出せるように、引用いたしますの。

もし url-path の最後に / を書いたなら、サーバがエイリアスを展開するためには、最後の / が必要になることに注意してください。すなわち、Alias /icons/ /usr/local/apache/icons/ というものを使用している場合は、 /icons という url はエイリアスされません。

おわりに

Apache の公式ドキュメントはこちらでございます。これくらい短いと読みやすいですわ。

本投稿のお話、1年以上前にノートしておこうと思ったまま、ずっと下書きに放置しておりました。ようやく整理できまして、胸がすっといたしましたの♪

以上です。

コメントを残す