🐾

Apache Aliasが正しく動作せず、DocumentRootへ誤って振り分けられる問題を解決する

2024/12/18に公開

やりたいこと

特定のURLにアクセスがあった場合、ApacheでDocumentRootではなく、別のディレクトリにアクセスするよう設定したいと考えました。

例えば、以下のような構成を目指しました:

  • http://example.com/project にアクセスすると、c:/dev/server_2/public/ にリクエストを振り分ける。

そのため、Apacheのhttpd.confに以下のようにAliasを記述しました。

Aliasの設定

Alias /project "c:/dev/server_2/public/"
<Directory "c:/dev/server_2/public/">
    # 任意の設定(例: Require all granted など)
</Directory>

DocumentRootの設定

DocumentRoot "c:/dev/server_1/public/"
<Directory "c:/dev/server_1/public/">
    # 任意の設定
</Directory>

この設定により、http://example.com/project にアクセスした場合、意図した通り c:/dev/server_2/public/ にリクエストが振り分けられました。

問題発生

しかし、次のようなURLにアクセスした場合に問題が発生しました:

http://example.com/project/abc

  • 期待する動作:
    • c:/dev/server_2/public/abc にアクセスする。
  • 実際の動作:
    • DocumentRootに記述したディレクトリ(c:/dev/server_1/public/abc)にアクセスしてしまう。

解決方法

問題の原因は、Aliasで記述したパスのドライブ名を小文字で指定していたことにありました。

解決するには、以下のようにドライブ名を大文字で指定するだけです:

修正後のAlias設定

Alias /project "C:/dev/server_2/public/"
<Directory "C:/dev/server_2/public/">
    # 任意の設定(例: Require all granted など)
</Directory>

DocumentRootの設定(変更なし)

DocumentRoot "c:/dev/server_1/public/"
<Directory "c:/dev/server_1/public/">
    # 任意の設定
</Directory>

原因について

なぜドライブ名の大文字・小文字の違いでこのような挙動の差が生じるのか、理由は分かりませんでした。
しかし、設定ファイルのディレクティブは大文字小文字を区別しないが、 引数にはしばしば区別するものがあるとのことです。
参考URL

この問題について調べても、類似の事例や解説記事がほとんど見つからなかったため、困っている方の助けになればと思い、本記事を記しました。

ラグザイア

Discussion