.htaccess mod_rewrite:通过检查文件是否存在来启用缓存

时间:2013-10-17 22:20:50

标签: php apache .htaccess caching mod-rewrite

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

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

  1. 检查是否存在缓存文件
  2. 如果是这样,mod_rewrite到缓存文件
  3. 如果没有,请不要执行任何操作以使脚本运行
  4. 到目前为止我所做的是略微修改的逻辑:

    1. mod_rewrite到缓存文件的位置
    2. 检查文件是否存在
    3. 如果没有,再次mod_rewrite请求
    4. 如果有更好的方法可以做到这一点,我很乐意听到它。在任何情况下,我的.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]
      

      产生内部服务器错误。

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

1 个答案:

答案 0 :(得分:2)

您拥有的第一个逻辑是您想要做的事情,绕过可能的循环问题。您只需要从%{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]
相关问题