RewriteRule для хранения тысяч файлов в подкаталогах - PullRequest
0 голосов
/ 01 мая 2010

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

Например 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

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

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2010

Преобразуя символы в подчеркивания, вы столкнетесь с проблемами при столкновениях. Например, --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
0 голосов
/ 01 мая 2010

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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...