RewriteRule与文件检查和调整图像大小

时间:2011-05-12 11:13:15

标签: php .htaccess mod-rewrite

我目前有这个文件夹结构:

img.domain.com/
    boats/
        boat1/
            1.jpg
            2.jpg
    trees/
        tree1/
            1.jpg
            2.jpg

我已经在 img.domain.com/index.php 上有一个PHP脚本来调整图像大小,还有一个RewriteRule可以让我以这种方式访问​​图像(调整大小或不调整大小): img.domain.com/boats/boat1/1/200/200/a-big-boat.jpg

为此我正在使用:

RewriteRule ([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)\.([^/]+) index.php?folder=$1&id=$2&file=$3&ext=$7&w=$4&h=$5&description=$6 [NC]

这一切都很好。

我想要的是,在使用PHP创建缓存图像后,如果它存在,则访问它,但仅使用RewriteRule。我不想用PHP检查文件。

我读了这个问题(Best way to cache resized images using PHP and MySQL),它有一个非常好的解决方案:

RewriteCond %{REQUEST_URI} ^/images/cached/
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /images/generate.php?$1 [L]

但我不能适应我的情况。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我为自己的问题找到了解决方案。

首先,PHP脚本必须在URL指向的位置创建缓存文件。这意味着,在调整图像大小后,将其保存在该路径上。

在我给出的示例中: img.domain.com/boats/boat1/1/200/200/a-big-boat.jpg (在第一个版本中不存在)时间被调用)将在该路径上保存图像( img.domain.com/boats/boat1/1/200/200 / ),名称为 a-big-boat.jpg < / strong>和200x200的大小。

现在,.htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)\.([^/]+) index.php?folder=$1&id=$2&file=$3&ext=$7&w=$4&h=$5&description=$6 [NC]

它将请求图像,如果不存在,请使用这些参数调用index.php并创建缓存。下次,它将获取缓存文件而不通过index.php。这个(.htaccess)比用PHP检查文件是否存在更好。

当然,RewriteRule仅适用于我的情况。

如果用户尝试访问img.domain.com/boats/1/200/或缓存系统创建的任何其他文件夹,请调整以避免列出。把它作为第一次重写条件。

RewriteCond %{REQUEST_FILENAME} -d
ErrorDocument 403 /forbidden.php

警告!请注意尺寸和文件名。在我的例子中,由于最终文件名(a-big-boat.jpg)与原始文件名(1.jpg)不同,因此用户只需更改最终名称即可创建无限缓存文件。大小相同。

根据您设置的标准尺寸检查所需尺寸。至于名称,我将从数据库中获取一个唯一的名称。这将仅针对每个图像/大小检查一次DB,并且在缓存后不再检查,因此这不是问题。如果名称正确,请创建缓存,如果没有发送到&#34;未找到图像&#34;。

我希望这可以帮助其他人。