2012-11-12 7 views
5

私は以下のような状況のための.htaccessのルールを作成します:.htaccessを使用してディレクトリ内の最新のファイルにリダイレクトすることはできますか?

  • 私はファイルへのリンクがあります。このファイルは、私が中/画像/最新のファイルにリダイレクトしたいが存在しない場合はhttp://something.com/images/some/image_001.png
  • をいくつかのディレクトリ

.htaccessを使用してこのようなことが可能ですか?ファイルがRewriteCondに存在するかどうかを確認できますが、最新のファイルにリダイレクトできるかどうかはわかりません。 CGIスクリプトに書き換え

+1

はあなたが作ることができません最新のファイルにリダイレクトしてRewriteCondを使用するスクリプト(PHPなど)? – mgarciaisaia

+0

私はできると思いますが、私は可能な限り最速の解決策を探していて、PHPスクリプトを作成するというのは第2の再分割を導入することを意味します。私は各ディレクトリの最新のファイルへのシンボリックリンクを持つソリューションについて考えています –

答えて

1

は技術的にはあなたがのhttpd.confファイル内のRewriteRuleでのプログラムによるRewriteMap命令を使用することができ、.htaccessファイルからあなたの唯一のオプションです。

スクリプトは直接ファイルを処理できるため、内部リライトではロジックは完全にサーバー側になります。

.htaccessのルール

getLatest.phpのようなものである
RewriteEngine On 
RewriteBase/

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

<?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: Get the Latest File Addition in a Directory

関連する問題