1

我们目前使用的是用 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/dir 中的调整大小匹配。所有缓存的图像都以名称存储cachFunctionWidth_height_originalName,因此对于给定的示例,内部生成的图像文件cache/将命名为resizecrop250_250_some-image.jpg

目前,我们正在利用 PHP 的fpassthru()函数将文件输出到浏览器(如果存在)。如果不是,我们使用 GD 函数和算法的组合将文件输出到浏览器。

我的问题是,如果使用 HTACCESS(它是 Linux 服务器)image.php的目录中存在调整大小的图像,我们是否可以完全绕过。cache本质上,我们需要在服务重写之前检查一个混蛋的名字形式。

例如,这是我们想要实现的一些伪代码,但我认为这是不可能的:

  • 用户请求文件 > domain.com/img/250x250/some-image.jpg
  • 检查文件是否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 无法做到这一点,也欢迎任何其他建议。

4

1 回答 1

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]
于 2013-09-23T14:35:39.460 回答