5

我想为以下情况创建 .htaccess 规则:

使用 .htaccess 可以实现这样的事情吗?我知道我可以使用 RewriteCond 检查文件是否存在,但不知道是否可以重定向到最新文件。

4

1 回答 1

1

重写 CGI 脚本是 .htaccess 的唯一选择,从技术上讲,您可以在httpd.conf文件中使用带有 RewriteRule的程序化 RewriteMap 。

该脚本可以直接为文件提供服务,因此通过内部重写,逻辑可以完全在服务器端,例如

.htaccess 规则

RewriteEngine On 
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^images/(.*)$  /getLatest.php [L]

其中getLatest.php类似于:

<?php

$dir = "/srv/www/images";
$pattern = '/\.(jpg|jpeg|png|gif)$/';
$newstamp = 0;
$newname = "";

if ($handle = opendir($dir)) {
   while (false !== ($fname = readdir($handle)))  {
     // Eliminate current directory, parent directory            
     if (preg_match('/^\.{1,2}$/',$fname)) continue;
     // Eliminate all but the permitted file types            
     if (! preg_match($pattern,$fname)) continue;
     $timedat = filemtime("$dir/$fname");
     if ($timedat > $newstamp) {
        $newstamp = $timedat;
        $newname = $fname;
      }
     }
    }
closedir ($handle);

$filepath="$dir/$newname";
$etag = md5_file($filepath); 

header("Content-type: image/jpeg");
header('Content-Length: ' . filesize($filepath));
header("Accept-Ranges: bytes");
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $newstamp)." GMT"); 
header("Etag: $etag"); 
readfile($filepath);
?>

注意:代码部分从以下答案中借用:PHP:获取目录中的最新文件添加

于 2012-11-15T20:09:53.113 回答