mod_rewrite RewriteCond 基于 Last-modified? (.htaccess)
Posted
技术标签:
【中文标题】mod_rewrite RewriteCond 基于 Last-modified? (.htaccess)【英文标题】:mod_rewrite RewriteCond based on Last-modified? (.htaccess) 【发布时间】:2010-11-22 00:46:24 【问题描述】:我知道我们可以轻松地将 RewriteCond 基于任何 http request 标头。但是我们可以检查(一些)将要发送的 response 标头吗?特别是Last-modified那个?
我只想在 Last-modified 日期超过 30 分钟时重写 url,并且我试图避免每次请求该目录中的文件时将该检查委派给 php 文件的开销。
提前致谢!
【问题讨论】:
【参考方案1】:不,这是不可能的。但是您可以使用rewrite map 从开销低于 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]
【讨论】:
由于 PHP 已经加载并在 Apache 进程中运行,因此生成一个新的 bash(每个请求一个)是否会更快,这一点还不清楚。我猜不是。 哇,太聪明了!非常感谢您的时间。但是,上面derobert的反对意见呢? @derobert:啊,抱歉,忘记了。该程序只启动一次,然后等待 SDTIN 上的输入。 我不得不承认它对我不起作用。但这就是它的完成方式。 即使您的 bash 脚本保持运行,您仍然会为每个请求生成至少一个stat
和一个 date
。顺便说一句:那不应该是[ ... ]
而不是[[ ... ]]
?【参考方案2】:
直到much
晚于mod_rewrite
才存在出站标头。 mod_rewrite
中也没有内置任何文件修改时间检查功能,因此您最接近使用它的是制作外部重写程序品种的 RewriteMap,以查明有问题的文件是否已被修改。
如果我正确理解您的应用程序,您还可以考虑让 cron 作业删除该目录中超过 30 分钟的文件,然后在文件不存在的情况下重写。
【讨论】:
是的,很明显。但是当时确实存在 Last-modified 标头,所以我认为也许有一些东西。我想没有 :-( 至于 cron,这正是我想要避免的。【参考方案3】:您是否考虑过使用 mod_proxy、mod_cache 和/或 squid?听起来您正在尝试使用自己的缓存...
【讨论】:
是的,我正在尝试缓存一些 php/gd 生成的图像,并在需要时每 30 分钟重新创建一次(=如果有人实际请求它们)。您认为 mod_proxy、mod_cache 或 squid 可以提供帮助吗?坦率地说,我从来没有真正调查过他们。我一直认为他们是为了更复杂的事情。 是的,您正在执行 Web 缓存,而这正是这些缓存的用途。当然,您应该只在重要的情况下才进行此优化(例如,您有需要它的流量)。以上是关于mod_rewrite RewriteCond 基于 Last-modified? (.htaccess)的主要内容,如果未能解决你的问题,请参考以下文章
mod_rewrite RewriteCond 基于 Last-modified? (.htaccess)