【问题标题】:Can mod_rewrite be used to find an older version of a file?可以使用 mod_rewrite 查找文件的旧版本吗?
【发布时间】:2014-01-31 19:28:00
【问题描述】:

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

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.php 将采用 request 并使用它查找并返回正确的文件。但是,出于多种原因,这对我来说不是一个好的解决方案,我想完全使用 .htaccess 进行重定向,尽可能不使用任何服务器端脚本。

编辑:

换个说法,给定一个不存在的文件名,当 按字母顺序排序 时,Apache 能否用于查找列表中的下一个文件。

例子:

a.txt
b.txt
z.txt

给定一个n.txt的请求,服务器返回b.txt

【问题讨论】:

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


    【解决方案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 是否存在等等。所有这些都无法进行任何数学运算。

    并不是说不可能创造出一些聪明的方法来让这一切都以某种方式运行,但上帝会帮助以后必须对其进行调整的人。

    【讨论】:

    • 只是出于好奇,处理前一年是否与处理前一天或前一个月不同或更困难?是不是都一样,因为它们是按字母顺序排序的?
    • "...并且无法找到具有下一个最小编号的文件..."--这是我希望可能的关键。感谢您的洞察力。
    • @brentonsrine 是的,您可以使用的唯一检查是字符串是否映射到现有文件 (-f)、目录 (-d)、符号链接、非空文件,等。无法获取所有文件的列表并对其进行比较。
    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 2012-02-19
    • 2015-04-02
    • 2021-10-21
    相关资源
    最近更新 更多