我认为@Paolo Stefan 和@anubhava 的两个答案都是有效的(+1)。
请注意,使用 RewriteMap 将强制修改 apache 配置,而不仅仅是 .htaccess 文件。如果您稍微考虑一下性能,实际上您应该将 .htaccess 文件中的所有内容放入<directory /same/filesystem/path/as/the/.htaccess/file/>
指令中并放入AllowOverride None
VirtualHost 配置中。通过避免每个查询的 Apache 文件 I/O 和动态检查配置文件设置,您肯定会获得一些速度(.htaccess 文件真的很糟糕)。所以RewriteMap在 .htaccess 中不可用的事实应该不是问题。
这两个答案提供了一种根据文件大小动态更改身份验证标头的方法。现在,您在问题中忘记提及的一个重要事实是,这些文件与 PHP 文件在同一台服务器上不直接可用,而且您不想在每次下载时启动脚本。
使用当前的@anubhava 解决方案,您将在每次访问时在操作系统上调用文件大小,当然该脚本应该在文件存储服务器上运行。
一种解决方案可能是将文件大小的索引存储在某个地方(专用数据库或键值存储?)。您可以在每次下载后提供此索引,您可以管理一些异步任务来维护它。然后在文件存储服务器的 apache 配置上,您将不得不启动一个脚本来检查文件大小。使用 RewriteMap 你有几个选项:
- 使用带有关键字的非常快速的脚本
prg:
(用 C、Perl 编写的任何东西,你不依赖于 PHP),在这个数据存储中请求这个文件大小的索引,甚至fastdbd:
直接在 apache 中执行 SQL 查询。但这意味着对每个请求进行查询,因此您有其他解决方案。
- 直接使用带关键字的o 映射文件
txt:
,为每个文件名计算匹配大小,不再查询,只需
- 更好的是,将此文件的哈希图与 dbm:` 关键字一起使用。
对于最后两个选项,文件大小索引是该文本文件的文本文件或散列版本。Apache 正在缓存 hashmap 并在重新启动或更改文件的修改时间时重新计算缓存。因此,您只需在每次下载后重新计算此哈希图,即可在 RewriteRule 中获得非常快速的文件大小检查,如 anubhava 所示,但使用
RewriteMap checkFileSize dbm:/path/to/filesize_precomputed_index.map
您还可以尝试在文件服务器上使用mod_security并检查Content-Length
标头以添加 HTTP Auth。检查此线程以获取有关该主题的答案的开头。但是 mod_security 配置并不是一件容易的事。