我目前有这个文件夹结构:
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]
但我不能适应我的情况。
有什么想法吗?
答案 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;。
我希望这可以帮助其他人。