重定向丢失图像文件的最快方法

时间:2011-06-14 18:11:26

标签: .htaccess optimization mod-rewrite redirect file-exists

我有一个动态缩略图系统,我正在尝试找到最好的方法,以确保在提供图像时尽可能快。这是当前的流程:

  • 用户请求缩略图thumbnails/this-is-the-image-name.gif?w=200&h=100&c=true
  • htaccess文件使用modrewrite将请求从此文件夹发送到PHP文件
  • PHP文件根据查询字符串值
  • 检查file_exists()所请求的图像

若是:

header('content-type: image/jpeg'); 
echo file_get_contents($file_check_path); 
die();

如果没有,则会创建缩略图并将其返回。

我的问题是,是否有一种方法可以将其优化为更快?理想情况下,我的htaccess文件会执行file_exists,只会在没有文件时将其发送到PHP文件...但由于我使用查询字符串,因此no way to build a dynamic URL to check。是否值得从查询字符串切换到实际的文件请求,然后在htaccess中进行存在检查?会更快吗?我更喜欢查询字符串语法,但目前所有请求都转到PHP文件,该文件返回图像是否存在。

感谢您提前输入任何内容!

1 个答案:

答案 0 :(得分:1)

你应该能够在理论上做到这一点。 RewriteCond命令有一个标志-f,可用于检查文件是否存在。你应该能够有这样的规则:

# If the file doesn't exist
RewriteCond %{REQUEST_FILENAME} !-f

# off to PHP we go
RewriteRule (.*)   your-code.php [L,QSA]

这里的转折是我想你是根据进来的参数命名文件 - 所以上面的例子可能是thumbnails/this-is-the-image-name-200-100.gif。如果是这种情况,您需要生成一个文件名以便即时测试,并检查该文件名而不是REQUEST_FILENAME - 详细信息确实特定于您的设置。如果可以,我会推荐某种不需要太多努力的系统。例如,您可以将缩略图存储在/width/height/filename等目录结构中的文件系统中,这比modified-filename-width-height.gif重写规则更容易检查。

如果你还没有检查过,Apache's mod_rewrite guide有很多不错的例子。

UPDATE :所以,您实际上需要从外观中检查动态文件名。我认为这样做最简单的方法就是将你生成的文件名粘贴到一个环境变量中,就像这样(我从你的另一个问题中借用来充实它):

# generate potential thumbnail filename
RewriteCond %{SCRIPT_FILENAME}%{QUERY_STRING} /([a-zA-Z0-9-]+).(jpg|gif|png)w=([0-9]+)&h=([0-9]+)(&c=(true|false))

# store it in a variable
RewriteRule .* - [E=thumbnail:%1-%2-%3-%4-%6.jpg]

# check to see if it exists
RewriteCond %{DOCUMENT_ROOT}/path/%{ENV:thumbnail} !-f 

# off to PHP we go
RewriteRule (.*)   thumbnail.php?file_name=%1&type=%2&w=%3&h=%4&c=%6 [L,QSA]

这是完全未经测试的,并且可能无法确定。我会推荐其他一些东西:

另外,我给你的一个重要建议是,如果可能的话,打开日志记录并将RewriteLogLevel设置为高级别。重写规则的日志可能非常复杂,但绝对可以让您了解正在发生的事情。您需要服务器访问才能执行此操作 - 如果我记得,您无法将日志记录配置放在.htaccess文件中。