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

Posted

技术标签:

【中文标题】重定向丢失图像文件的最快方法【英文标题】:Fastest way to redirect missing image files 【发布时间】:2011-09-14 22:30:37 【问题描述】:

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

用户请求缩略图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】:

理论上你应该可以做到这一点。 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 有很多不错的例子。

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

# 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 文件中。

【讨论】:

你一针见血,这正是我几周来一直试图弄清楚的。从the other question I have open here 可以看出。我根本无法让 apache 识别动态文件路径。您能否进一步解释为什么您认为使用文件夹结构可能比使用文件名更好?我查看了 mod_rewrite 指南,但没有找到任何有助于解决这个特定问题的东西。谢谢! @cbh,我查看了您的另一个问题,我认为您可以忽略我关于文件夹结构的说明,因为您似乎已经接近完成这项工作。我在答案中添加了一些注释,希望它们有所帮助。

以上是关于重定向丢失图像文件的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

Django 图像 url 重定向是通过 HTML 模板的链接而不是媒体文件?

从重定向重写规则中排除图像文件夹

图像 Mime 类型未重定向到“保存/打开”对话框

如何将任何图片文件类型重定向到同名的php文件?

ASP.NET Core 3.1 图像 URL 错误代码 302 重定向

.htaccess 允许图像直接显示