使用 mod_rewrite 进行内部重定向后提供不区分大小写的文件

Case insensitive file serving after internal redirect with mod_rewrite

我正在尝试从 Apache 服务器提供不区分大小写的文件,该服务器需要使用 mod_rewrite 来提供子文件夹中的文件。

.
├── .htaccess
├── example.com
│   └── downloads
│       └── file.zip
└── www.reddit.com
    └── r
        └── programming
            └── index.html

服务器充当代理并根据 HTTP 主机变量为每个文件夹提供服务。 为此,我使用 .htaccess 执行简单的内部重定向。

问题出现是因为还需要不区分大小写,我想服务file.zipFiLe.zipFILE.ZIP等。 为此,我尝试了 mod_speling,几乎可以正常工作。问题是,如果我访问 FiLe.zip,我将被重定向到 http://example.com/example.com/downloads/file.zip,这是一个 404.

据我了解,mod_speling 在实际路径中工作,所以结果是有道理的。然而,并不尽如人意。

有什么方法可以重写 mod_speling 的更正路径吗? 如果没有,是否有另一种可能的方法来完成此操作?

我还尝试堆叠 ciopfs 保险丝安装,这是一个不区分大小写的覆盖文件系统,但它看不到这些文件,因为如果它们包含任何大写字符,它会跳过它们。

我无法将这些子文件夹中的每一个都配置为不同的虚拟主机,因为这些文件夹有数百个,而且它们是动态添加或删除的。

您可以将该位置挂载为本地 smb 挂载(服务器为本地主机),可能使用 Samba 服务器。它将在现有区分大小写的文件之上表现出不区分大小写的行为。这是对性能的过度杀伤,因为它向堆栈添加了一层 client-server 流量,但它会完成工作。

最终编写了我自己的 FUSE 文件系统作为 ciopfs 的替代品。

https://github.com/XXLuigiMario/fuzzyfs

此文件系统尝试通过检查同一目录中具有相同文件名但大小写不同的不同实例来定位文件。与 mod_speling 尝试更正大写错误的方式类似。要使用它,你只需要给它一个目录和一个挂载点:

$ fuzzyfs /mnt/data /var/www/htdocs

这个挂载点将镜像给定的目录,但它也会像其底层文件系统不区分大小写一样执行。此工具需要在系统上安装 FUSE。要安装 fuzzyfs,请使用 git 和 运行 make && make install.

克隆它