mod_rewrite RewriteCond基于Last-modified?(htaccess的)

Lea*_*rou 6 .htaccess mod-rewrite httpresponse last-modified

我知道我们可以轻松地在任何http 请求标头上建立RewriteCond .但是我们可以检查(某些)将要发送的响应标头吗?特别是最后修改过的一个?

我想只在最后修改日期超过30分钟时重写一个URL,并且我试图避免每次请求该目录中的文件时将该检查委托给php文件的开销.

提前致谢!

Gum*_*mbo 9

不,那是不可能的.但您可以使用重写映射从程序中获取该信息,而开销比PHP少,可能是shell脚本.

这是一个示例bash脚本:

#!/usr/bin/env bash
while read line; do
    max_age=${line%%:*}
    filename=${line#*:}
    if [[ -f $filename ]]; then
        lm=$(stat -f %m "$filename")
        if [[ $(date +%s)-$lm -le $max_age ]]; then
            echo yes
        else
            echo no
        fi
    else
        echo no
    fi
done
Run Code Online (Sandbox Code Playgroud)

重写映射的声明需要放在您的服务器或虚拟主机配置文件中,因为程序刚启动一次然后等待输入:

RewriteMap last-modified-within prg:/absolute/file/system/path/to/last-modified-within.sh
Run Code Online (Sandbox Code Playgroud)

然后你可以使用这样的重写映射(.htaccess示例):

RewriteCond %{last-modified-within:30:%{REQUEST_FILENAME}} =yes
RewriteRule ^foo/bar$ - [L]
RewriteRule ^foo/bar$ script.php [L]
Run Code Online (Sandbox Code Playgroud)


cha*_*aos 0

much出站标头直到晚于mod_rewrite生效时才存在。也没有内置任何文件修改时检查功能mod_rewrite,因此您最接近的使用方式是创建外部重写程序类型的RewriteMap,以查明相关文件是否已被修改。

如果我正确理解您的应用程序,您还可以考虑让 cron 作业删除该目录中超过 30 分钟的文件,然后在文件不存在的情况下重写。