代码之家  ›  专栏  ›  技术社区  ›  onassar

根据文件是否写入文件系统动态地为文件提供服务

  •  0
  • onassar  · 技术社区  · 14 年前

    糟糕的标题,但不知道如何描述情况太好。 我想动态调整/裁剪图像。我希望配置我的apache来执行以下操作:

    • 请求/img/profile.jpg?收到作物&p=50
    • Apache检查文件是否存在
    • 如果它确实存在,它就可以静态地运行,而不必打我的PHP服务器。
    • 如果它不存在,它会点击/ PHP?路径=/img/profile.jpg&p=50
    • 然后,该文件将图像写入文件,并为其提供服务
    • 再次请求(请参阅步骤1)

    我想使用.htaccess文件中的FilesMatch指令可能会对我们有帮助,但我真的不知道从哪里开始。任何链接,或任何想法都会受到赞赏。

    谢谢大家。

    1 回复  |  直到 14 年前
        1
  •  1
  •   icanhasserver    14 年前

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

    接下来,您可能需要调整文档根目录,使“profile”部分更通用:

    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]
    

    脚本将检查文件是否存在,要么传递它,要么首先生成它。

    从请求的URL获取图像名称的解决方案:

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

    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]