Php 使用文件检查重写规则并调整图像大小

Php 使用文件检查重写规则并调整图像大小,php,.htaccess,mod-rewrite,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脚本,可以调整图像大小,还有一个重写规则,允许我以这种方式访问图像大小:img.domain.com/boats/boat

我目前有以下文件夹结构:

img.domain.com/
    boats/
        boat1/
            1.jpg
            2.jpg
    trees/
        tree1/
            1.jpg
            2.jpg
我已经在img.domain.com/index.PHP上有一个PHP脚本,可以调整图像大小,还有一个重写规则,允许我以这种方式访问图像大小: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创建缓存图像后,如果它存在,就访问它,但只能使用重写规则。我不想用PHP检查文件

我读到这个问题有一个很好的解决方案:

RewriteCond %{REQUEST_URI} ^/images/cached/
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /images/generate.php?$1 [L]
但我不能适应我的情况


有什么想法吗?

我找到了解决我自己问题的办法

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

在我给出的示例中:img.domain.com/boat1/1/200/200/a-big-boat.jpg在第一次调用时不存在,它将在路径img.domain.com/boats/boat1/1/200/200/上保存一个名为a-big-boat.jpg、大小为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检查文件是否存在要好

当然,重写规则只适用于我的情况

如果用户试图访问img.domain.com/boats/1/200/或缓存系统创建的任何其他文件夹,则进行调整以避免列出。将此作为第一个重写条件

RewriteCond %{REQUEST_FILENAME} -d
ErrorDocument 403 /forbidden.php
警告!注意大小和文件名。在我的例子中,由于最终文件名a-big-boat.jpg与原来的1.jpg不同,用户只需更改最终文件名即可创建无限缓存文件。尺寸也一样

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

我希望这能帮助其他人