我知道我们可以轻松地将 RewriteCond 基于任何 http请求标头。但是我们可以检查(一些)将要发送的响应头吗?特别是最后修改的那个?
我只想在 Last-modified 日期超过 30 分钟时重写 url,并且我试图避免每次请求该目录中的文件时将该检查委派给 php 文件的开销。
提前致谢!
我知道我们可以轻松地将 RewriteCond 基于任何 http请求标头。但是我们可以检查(一些)将要发送的响应头吗?特别是最后修改的那个?
我只想在 Last-modified 日期超过 30 分钟时重写 url,并且我试图避免每次请求该目录中的文件时将该检查委派给 php 文件的开销。
提前致谢!
不,那是不可能的。但是您可以使用重写映射从开销低于 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]
出站标头不存在,直到much
迟于mod_rewrite
执行。也没有内置任何文件修改时间检查功能mod_rewrite
,因此最接近使用它的方法是制作外部重写程序种类的RewriteMap,以查明相关文件是否已被修改。
如果我正确理解您的应用程序,您还可以考虑让 cron 作业删除该目录中超过 30 分钟的文件,然后在文件不存在的情况下重写。
您是否考虑过使用 mod_proxy、mod_cache 和/或 squid?听起来您正在尝试滚动自己的缓存...