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)

只允许某些IP地址使用mod_rewrite访问网站?

RewriteCond 和RewriteRule规则说明 (转)

无法启用 mod_rewrite

Azure 中的 Mod_rewrite

mod_rewrite:删除尾部斜杠(只有一个!)