动态提供文件取决于它们是否已写入文件系统

时间:2010-11-21 18:47:55

标签: apache apache2 crop

可怕的头衔,但真的不知道如何描述这种情况。 我想动态调整大小/裁剪图像。我希望配置我的apache来执行以下操作:

  • 收到/img/profile.jpg?crop&p=50的请求
  • Apache检查文件/img/profile.c.50.jpg是否存在
  • 如果它确实存在,它可以静态提供,而不必点击我的php服务器
  • 如果它不存在,则会命中/cropper.php?path=/img/profile.jpg&p=50
  • 此文件然后将图像写入文件并提供服务
  • 请求再次出现(参见步骤1)

我觉得在.htaccess文件中使用FilesMatch指令可能是我们的,但我真的不知道从哪里开始。任何链接都将受到赞赏,或任何想法。

谢谢大家。

1 个答案:

答案 0 :(得分:1)

\就个人而言,我将此任务委托给一个脚本(可能使用X-Sendfile),而不是重写一次。

在这里,您可能需要调整您的文档根目录并使您的“个人资料”部分更加通用:

RewriteEngine on
RewriteCond %{QUERY_STRING} "(?:^|&)crop&p=50"
RewriteCond %{REQUEST_URI} ^(/img/profile)(\.png)$
RewriteCond /your/document/root%1.c.50%2 -f
RewriteRule ^ %1.c.50%2 [L]

# hand over to crop script if the above doesn't match
RewriteCond %{REQUEST_URI} =/img/profile.png
RewriteRule ^ /cropper.php?path=%{REQUEST_URI}&p=50 [L]

始终涉及脚本的解决方案: (为了清楚起见,通过/ img / profiles / ...访问)

  • $ 1捕获个人资料名称(在这种情况下假设为'a-z'仅
  • $ 2捕获所需的宽度
  • $ 3文件扩展名

这真正简化了重写:

RewriteEngine on
RewriteRule ^/img/profiles/([a-z]+)\.([1-9][0-9]+)\.(jpe?g|gif|png)$ /cropper.php?profile=$1.$3&p=$2 [L]

该脚本将检查文件是否存在,并将其传送或首先生成。

解决方案从请求的网址中获取图片名称:

(正如你在评论中提到的)

RewriteEngine on
RewriteCond %{REQUEST_URI} ^(/img/profile)\.([1-9][0-9]+)\.(png|gif|jpe?g)$
RewriteCond /your/document/root%{REQUEST_URI} -f
RewriteRule ^ %{REQUEST_URI} [L]

# hand over to crop script if the above doesn't match
RewriteCond %{REQUEST_URI} ^(/img/profile)\.([1-9][0-9]+)\.(png|gif|jpe?g)$
RewriteRule ^ /cropper.php?path=$1.$3&p=$2 [L]

如果图像直接存储在您的文档根目录中,则可以将其重写为以下内容:

RewriteCond %{REQUEST_URI} ^(/img/profile)\.([1-9][0-9]+)\.(png|gif|jpe?g)$
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule ^ /cropper.php?path=$1.$3&p=$2 [L]