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,并且在缓存后不会再次检查,因此这不是问题。如果名称正确,则创建缓存,如果没有,则发送到未找到的图像
我希望这能帮助其他人