6

我知道我们可以轻松地将 RewriteCond 基于任何 http请求标头。但是我们可以检查(一些)将要发送的响应头吗?特别是最后修改的那个?

我只想在 Last-modified 日期超过 30 分钟时重写 url,并且我试图避免每次请求该目录中的文件时将该检查委派给 php 文件的开销。

提前致谢!

4

3 回答 3

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

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

RewriteMap last-modified-within prg:/absolute/file/system/path/to/last-modified-within.sh

然后您可以像这样使用该重写映射(.htaccess 示例):

RewriteCond %{last-modified-within:30:%{REQUEST_FILENAME}} =yes
RewriteRule ^foo/bar$ - [L]
RewriteRule ^foo/bar$ script.php [L]
于 2009-08-23T09:15:41.420 回答
0

出站标头不存在,直到much迟于mod_rewrite执行。也没有内置任何文件修改时间检查功能mod_rewrite,因此最接近使用它的方法是制作外部重写程序种类的RewriteMap,以查明相关文件是否已被修改。

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

于 2009-08-23T09:17:10.293 回答
0

您是否考虑过使用 mod_proxy、mod_cache 和/或 squid?听起来您正在尝试滚动自己的缓存...

于 2009-08-23T09:54:01.637 回答