【问题标题】:mod_rewrite to serve static cached files if they exist and if the source file hasn't changedmod_rewrite 提供静态缓存文件(如果它们存在且源文件未更改)
【发布时间】:2011-03-02 22:21:49
【问题描述】:

我正在处理一个处理图像、将处理后的图像保存在缓存中并将处理后的图像输出到客户端的项目。假设项目位于 /project/,缓存位于 /project/cache/,源图像位于服务器上的任何其他位置(如 /images/ 或 /otherproject/images/)。我可以设置缓存来镜像源图像的路径(例如,如果源图像是 /images/image.jpg,则该图像的缓存可能是 /project/cache/images/image.jpg)和请求到项目大致是/project/path/to/image(例如/project/images/image.jpg)。

我想尽可能高效地提供缓存中的图像(如果存在)。但是,我还希望能够检查源图像在创建缓存图像后是否发生了变化。理想情况下,这一切都将通过 mod_rewrite 完成,因此不需要使用 PHP 来完成任何工作。

这可能吗? mod_rewrite 规则需要什么才能起作用?

另外,让 mod_rewrite 大部分时间为缓存文件提供服务似乎是一个很好的折衷方案,但将 X 个请求中的 1 个发送到 PHP 脚本以获取缓存的文件。这可能吗?

【问题讨论】:

    标签: apache caching .htaccess mod-rewrite


    【解决方案1】:

    您无法从RewriteRule 访问文件修改时间戳,因此无法使用 PHP 或其他编程语言来完成该任务。

    另一方面,这在 PHP 中非常简单,因此您应该首先检查 PHP 解决方案是否适合您的情况。只有当它不是你应该寻找替代品。

    【讨论】:

    • 感谢您的回复。 PHP 解决方案似乎很适合我的使用,但使用该项目的其他人遇到了问题。对于缓存的文件,您对向 PHP 脚本发送 1 个 X 请求有什么建议吗?
    【解决方案2】:

    如果您使用客户端来完成某些工作会怎样?假设您在 Web 浏览器中显示图像并始终使用 src="/cache/images/foobar.jpg" 并添加 onerror="this.src='/images/foobar.jpg'"。在 mod_rewrite 中,将任何进入 /images/ 目录的内容发送到脚本,该脚本将返回并在缓存中生成图像。

    【讨论】:

    • 这仍然不能解决更新缓存图像的问题。您正在编写 CDN 服务吗? :)
    • 该项目不处理客户端代码,它被设计为只处理请求,所以这不是一个选项。在我发布我的问题后,我注意到了另一个问题。看起来我最好的选择可能是使用带有一些随机纯文本的 RewriteMap 来向脚本发送一些请求。
    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2013-10-06
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多