我们目前使用的是用PHP编写的图像缩放器。调整大小脚本利用缓存,并将生成的已调整大小的图像写入缓存目录(恰当地命名为cache/
)。
该过程是重写的URL,例如:
domain.com/img/250x250/some-image.jpg
将重写为:
domain.com/image.php?width=250&height=250&src=some-image.jpg&function=resizeCrop
在image.php
内,我们会检查文件是否与cache/
目录中的调整大小相匹配。所有缓存的图像都以cachFunctionWidth_height_originalName
的名称存储,因此对于给定的示例,cache/
中生成的图像文件将被命名为resizecrop250_250_some-image.jpg
目前,我们正在利用PHP的fpassthru()
函数将文件输出到浏览器(如果存在)。如果不是,我们使用GD功能和算法的组合将文件输出到浏览器。
我的问题是,如果使用HTACCESS(它是Linux服务器)在image.php
目录中存在已调整大小的图像,我们是否可以完全绕过cache
。基本上,我们需要在重写之前检查一个卑鄙的名字形式。
例如,这里有一些我们想要实现的伪代码,但我认为不可能:
cache/resizecrop250_250_some-image.jpg
是否存在cache/resizecrop250_250_some-image.jpg
domain.com/image.php?width=250&height=250&src=some-image.jpg&function=resizeCrop
如果通过HTACCESS无法做到这一点,那么欢迎任何其他建议。
答案 0 :(得分:2)
我相信使用mod_rewrite是可能的。请考虑以下规则:
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
# check if constructed image name exists in cache directory
RewriteCond %{DOCUMENT_ROOT}/cache/resizecrop$1_$2_$3 -f
# exists, redirect to cache/constructed-image-file-name
RewriteRule ^img/([0-9]+)x([0-9]+)/([^.]+\.(?:jpe?g|gif|bmp|png))$ /cache/resizecrop$1_$2_$3 [L,NC]
# doesn't exist then forward to image.php with required query parameters
RewriteRule ^img/([0-9]+)x([0-9]+)/([^.]+\.(?:jpe?g|gif|bmp|png))$ /image.php?width=$1&height=$2&src=$3&function=resizeCrop [L,NC]