【问题标题】:.htaccess mod_rewrite: enabling caching via checking if file exists.htaccess mod_rewrite:通过检查文件是否存在来启用缓存
【发布时间】:2013-10-26 15:05:57
【问题描述】:

我正在为动态生成的图像实现一个缓存系统。该脚本通过/img/type/param1/param2.png 调用,其中可以有多种类型并且参数的数量是可变的。该脚本生成图像并将其转储到磁盘。

我想要.htaccess规则,在请求图片生成脚本时:

  1. 检查是否存在缓存文件
  2. 如果是,则 mod_rewrite 到缓存文件
  3. 如果没有,请不要执行任何操作以使脚本运行

到目前为止,我的逻辑稍作修改:

  1. mod_rewrite 到缓存文件所在的位置
  2. 检查文件是否存在
  3. 如果没有,请再次 mod_rewrite 请求

如果有更好的方法来做到这一点,我很想听听。无论如何,我的 .htaccess 文件的相关部分:

RewriteRule ^img/(type1|type2)/(.*)$ /images/cache/$1/$2

RewriteCond /^(.*)$ !-f
RewriteRule images/cache/(.*) /img/$1

这似乎不太正确。为了调试它,我在第一个 RewriteRule 之后插入了以下内容(目标页面只是转储其输入):

RewriteRule ^(.*)$ /htaccess.php?url=$1 [END]

结果,我得到:

Array
(
    [url] => /images/cache/a/l/300.png/a/l/300.png
)

我不明白为什么$2 包含l/300.png/a/l/300.png 而不仅仅是l/300.png

如果我将第一个 RewriteRule 更改为包含 [L],我会得到预期的结果。但是,我在第二个 RewriteRule 上遇到了完全相同的“双重匹配”问题,它将请求恢复为非缓存版本。但是,将[L] 添加到第二个 RewriteRule:

RewriteRule ^img/(type1|type2)/(.*)$ /images/cache/$1/$2 [L]

RewriteCond /^(.*)$ !-f
RewriteRule images/cache/(.*) /img/$1 [L]

产生内部服务器错误。

我做错了什么,我该如何解决这个问题?

【问题讨论】:

    标签: php apache .htaccess caching mod-rewrite


    【解决方案1】:

    您拥有的第一个逻辑是您想要做什么,它绕过了可能的循环问题。您只需从%{REQUEST_URI} 中提取相关位,然后使用% 引用反向引用它们。比如:

    RewriteCond %{REQUEST_URI} ^/img/(.*)$
    RewriteCond %{DOCUMENT_ROOT}/images/cache/%1 -f
    RewriteRule ^img/(.*)$ /images/cache/$1 [L]
    

    或使用您拥有的正则表达式模式:

    RewriteCond %{REQUEST_URI} ^/img/(type1|type2)/(.*)$
    RewriteCond %{DOCUMENT_ROOT}/images/cache/%1/%2 -f
    RewriteRule ^img/(.*)$ /images/cache/$1 [L]
    

    【讨论】:

    • 这非常有效,非常感谢。为了我自己的启迪,为什么我的尝试没有奏效?
    • @Mala 我不是 100% 确定,但您可能想用 RewriteCond %{REQUEST_FILENAME} !-f 替换 RewriteCond /^(.*)$ !-f,因为新的 URI 是 /images/cache 一个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2011-09-11
    • 2011-09-12
    • 2017-09-04
    相关资源
    最近更新 更多