Linux でファイル名の大文字小文字を同一視する

かつて Windows server で動いていたらしい、とあるコンテンツを Linux + Apache の環境に載せてくれないか、というお話をいただきまして。何のことはない、静的コンテンツなのでファイル置くだけだろうと思ったら、なんと URL の大文字小文字が同一視されることを期待した作りになっていた。

ファイル名   foo/bar.html
HTMLの記述 <a href="foo/Bar.html">

つまりこんな感じ(B が大文字)。IIS だとこれで動いてしまう。ファイルシステム自体が区別しないから。

さて困った。

  • URL は JS の中で文字列を組み立てていたりするので、単純な文字列置換で対処はできなさそう
  • ファイルシステム上では全部小文字に揃えて、rewrite とかで何とかするか?

twitter で聞いてみたところ、

という意見をいただいたので試してみます。

まず FAT32。サーバに空いてるパーティションはないので、ループバックデバイスとして作る。

$ dd if=/dev/zero of=./fat32.disk bs=1M count=20
$ mkfs.vfat fat32.disk
# mount -o loop -t vfat fat32.disk /mnt/misc

/mnt/misc にファイルをコピーして、Apache から見えるようにしたら OK.

ciopfs も試す。

# apt-get install libfuse-dev libattr1-dev
$ tar zxvf ciopfs-0.2.tar.gz
$ cd ciopfs-0.2
$ make
# make install

マウントしたユーザ以外からも見せたい (Apacheから参照する) ので、/etc/fuse.conf に

user_allow_other

を記述。

# cd /mnt
# mkdir .data                      # 実体ファイルが置かれるディレクトリ作成
# ciopfs -o allow_other .data misc # マウント

これで /mnt/misc が大文字小文字を区別しないファイルシステムとしてマウントされる。

実例

# echo hello > hello.txt
# cat Hello.txt HELLO.TXT hELLO.tXt
hello
hello
hello

ということで、結論としてはどちらでも大文字小文字を区別しない URL を提供できるようです。
ファイルの所有者やパーミッションの扱いを考えると、FAT32 よりも ciopfs のほうが運用しやすそうですね。 id:tokuhirom++ id:hirose31++