mod_rewrite可以用来查找文件的旧版本吗?

时间:2014-01-31 19:28:00

标签: apache .htaccess mod-rewrite redirect mod-alias

假设服务器上有四个文件以某种方式包含文件名中的日期:

file_2014-01-20.txt
file_2014-01-03.txt
file_2014-01-02.txt
file_2014-01-01.txt

...并且服务器收到一个不存在的日期文件的请求:

file_2014-01-10.txt

...有没有办法使用mod_rewrite或其他.htaccess代码来查找比请求的文件旧的最新文件?例如。在这种情况下,它将返回file_2014-01-03.txt,因为这是最新的现有文件,它比(不存在的)请求文件旧。

我知道我可以将所有404重定向到这样的特殊脚本:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+) getarchive.php?request=$1

... getarchive.phprequest.htaccess并使用它查找并返回正确的文件。但是,由于多种原因,这对我来说不是一个好的解决方案,如果可能的话,我想完全使用a.txt b.txt z.txt 重定向,而不使用任何服务器端脚本。

修改

以另一种方式提出问题,给定一个不存在的文件名,当按反向字母顺序排序时,可以使用Apache查找列表中的下一个文件。

示例:

n.txt

根据b.txt的请求,服务器返回{{1}}。

1 个答案:

答案 0 :(得分:1)

只要编写一个脚本来完成此操作,您将会更好地方式。使用mod_rewrite的日期比较,如果有人甚至设法做到这一点,听起来像一个可怕的想法。你怎么去前几年编码呢? (如file_2013-12-30.txt和file_2014-01-30.txt)

mod_rewrite的功能完全不足以进行这种比较。

你必须创建年,月和日的分组,然后在不使用任何条件的情况下与它们进行比较(在mod_rewrite中没有If / Then / Else,你必须每次枚举每个可能的条件对于每个规则)或受控循环,没有任何算术函数,并且没有找到具有下一个最小数字的日期,日期/月或日期/月/年的文件的方法。对于像file_2014-01-10.txt这样的请求,您必须检查文件file_2014-01-09.txt是否存在,如果file_2014-01-08.txt存在,那么file_2014-01-07.txt是否存在等等。所有这些都无法执行做任何数学。

并不是说不可能创造一些聪明的方法让它以某种方式完成所有工作,但是上帝帮助那些必须在之后对其进行调整的人。