RewriteRule基于文件存在与另一个名称

时间:2013-09-23 14:28:11

标签: php regex .htaccess mod-rewrite

我们目前使用的是用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。基本上,我们需要在重写之前检查一个卑鄙的名字形式。

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

  • 用户请求文件> 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无法做到这一点,那么欢迎任何其他建议。

1 个答案:

答案 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]