2010-04-30 2 views
0

У меня есть веб-сайт, который будет иметь миллионы страниц в каталоге. Я хотел бы хранить эти файлы на диске в кучке подкаталогов на основе первых символов имени страницы.RewriteRule для хранения тысяч файлов в подкаталогах

Например http://mysite.com/hugedir/somefile.html

будет храниться в /var/www/html/hugedir/s/o/m/e/f/ile.html

То есть достаточно тривиально сделать с RewriteRule следующим образом:

RewriteRule ^hugedir/(.)(.)(.)(.)(.)(.*).html /hugedir/{$1}/{$2}/{$3}/{$4}/{$5}/$6.html 
RewriteRule ^hugedir/(.)(.)(.)(.)(.*).html  /hugedir/{$1}/{$2}/{$3}/{$4}/{$5}.html 
RewriteRule ^hugedir/(.)(.)(.)(.*).html   /hugedir/{$1}/{$2}/{$3}/{$4}.html 
RewriteRule ^hugedir/(.)(.)(.*).html   /hugedir/{$1}/{$2}/{$3}.html 
RewriteRule ^hugedir/(.)(.*).html    /hugedir/{$1}/{$2}.html 
RewriteRule ^hugedir/(.*).html     /hugedir/{$1}.html 

Однако, имя файла может содержать дефисы или другие нестандартные символы и я бы действительно бы избежать каталог с именем странным характером. В идеале, я хотел бы иметь список «одобренных» символов и исключать или преобразовывать неутвержденные символы в символ подчеркивания.

Может ли кто-нибудь подумать о способе сделать это? Или что-то еще эквивалентное? Часть требования состоит в том, что они являются физическими файлами на диске и не анализируются языком сценариев.

ответ

0

Apache mod_rewrite позволяет указать внешнюю программу для создания сопоставления. (Искать «Внешняя программа перезаписи»). Например, вы можете сделать это в Perl.

Например:

#!/usr/bin/perl 
$| = 1; 
while (<STDIN>) { 
    chomp; 
    $dir= $_ . "_________"; 
    $file = $_; 
    $dir =~ tr/a-zA-Z0-9/X/c; 
    $dir =~ s!^(.)(.)(.)(.).*!$1/$2/$3/$4!; 
    print "$dir/$file\n"; 
} 
0

Преобразуя символы в символы подчеркивания, вы столкнетесь с проблемами столкновений. Например, --a и -=a оба будут преобразованы в _/_/a.

Лучший способ решения этой проблемы было бы избежать символов, используя RewriteMap и встроенную escape функцию:

RewriteMap escape int:escape 
RewriteRule hugedir/(.*).html /hugedir/${escape:1}.html 
RewriteRule hugedir/(.)(.*).html /hugedir/${escape:1}/${escape:2}.html 
+1

Collissions не будет проблемой, если первые символы (убежали) используются для создания каталогов , но они также хранятся в имени файла. Например, RewriteRule^hugedir /(.)(.)(.*). Html /hugedir/{$1}/{$2}/{$1}{$2}{$3}.html – leonbloy

+0

А, очень умный. Я не думал об этом. –

+0

Это переписываниеМарка кажется многообещающим, но «побег» не производит шестнадцатеричное кодирование? (например, $ =>% 25) – leonbloy

Смежные вопросы