Назад | Перейти на главную страницу

переписать URL-адрес, чтобы сгенерированный кеш миниатюр был статическим, вопрос синтаксиса

это заноза в заднице-проблема !! Дано: большинство прокси не кэшируют ресурсы с "?" в их URL, даже если в ответе присутствует заголовок Cache-control: public. Чтобы включить кэширование прокси для этих ресурсов, я удалил строки запроса из ссылок на статические ресурсы за счет очень уродливого кода регулярного выражения apache! *

Часть 1 СДЕЛАНО с участием подсказки от двух гениев Dennis Williamson & Mark Henderson
Часть 2 ЗДЕСЬ этот вопрос касается части II: сделать код элегантным и менее аккуратным

ПРЕДЫДУЩИЙ БЫЛ

 <img src="/imgcpu?src=folder1/some_funny_kitty.jpg&w=3500&h=10&c=p&q=90" />
 <img src="/imgcpu?src=folder3/camels_ride_on_birds.jpg&w=200&h=500&f=bw&q=10" />
 <img src="/imgcpu?src=folder3/clay_loves_frogs.jpg&h=200" />

СЕЙЧАС РАБОТАЕТ

<img src="/IMG-folder1/some_funny_kitty_w3500_h10_cp_q90.jpg" />
<img src="/IMG-folder3/camels_ride_on_birds_w200_h500_fbw_q10.jpg" />
<img src="/IMG-folder3/clay_loves_frogs_h200.jpg" />

ЗА СТОИМОСТЬ ЭТОГО НЕЭЛЕГАНТНОГО КОДЕКСА

# Rewrite imgcpu?src= thumbnail maker to nice static urls
RewriteCond %{REQUEST_URI} ^IMG.*$
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+)_f(.+)_q(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&c=$4&f=$5&q=$6 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+)_f(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&c=$4&f=$5 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+)_q(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&c=$4&q=$5 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&c=$4 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_f(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&f=$4 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_q(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3&q=$4 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2&h=$3 [L]
RewriteRule ^IMG-(.+)_w(.+).jpg$ imgcpu\?src=$1\.jpg&w=$2 [L]
RewriteRule ^IMG-(.+)_h(.+).jpg$ imgcpu\?src=$1\.jpg&h=$3 [L]
+ many many other combinations etcettera!

примечания: 1) imgcpu.php? src = при необходимости можно изменить. 2) изображения всегда будут в одной папке глубже, никогда не глубже 3) все файлы будут заканчиваться на .jpg после того, как начинаются разделители IMG-folder1/some_file_w100_h200.jpg (красивый статический URL-адрес .jpg)
imgcpu?src=folder1/some_file.jpg&w=100&h=200 (уродливый URL файла)

Поскольку imgcpu [.php] может быть изменен, вот мой ответ, чтобы очистить это, даже если это отменит большую часть той работы, которую вы сделали

Внутри программы вы можете перебрать все возможные атрибуты и извлечь те, которые присутствуют (в любом порядке!). Вы можете заменить все эти правила одним правилом:

RewriteRule ^IMG-(.*)$ imgcpu\?parse=$1 [L]

а затем в сценарии imgcpu у вас будет "parse" как переменная, содержащая folder1/some_funny_kitty_w3500_h10_cp_q90.jpg. Удалите расширение с конца, папку и имя файла с начала, а затем вы можете перебирать различные параметры и извлекать их из строки. Что-то вроде (PHP, но концепция может быть реализована на любом языке. Можно даже сэкономить несколько мс, сделав это без регулярных выражений):

$values["q"]=50; // Set some defaults?
foreach (array("h","w","q","c","f") as $param) {
   if (preg_match("/_${param}([^_]+)/",$_REQUEST["parse"],$result)) {
     $values[$param]=$result[1];
   }
}

В конце $values["h"] имел бы высоту. Это будет намного проще поддерживать, если вы когда-нибудь захотите добавить новые параметры. Вам потребуется немного поработать, чтобы понять, что вы должны делать с "my_w2000_desktop_w200_h100.jpg" (или хуже: "my_w2000_desktop_h100.jpg" или еще хуже "desktop_for_w2000_h100.jpg"), но если вы запретите людям использовать двойные подчеркивания в именах файлов, вы можете использовать двойные подчеркивания, чтобы отделить имя файла от параметров (например, "my_w2000_desktop__h100.jpg") и разделить строку там (обратите внимание, что регулярные выражения выше требуют что каждая опция начинается с символа _)

Более простой вариант

Если вы можете согласиться с тем, что параметры не закодированы в самом имени файла (это может привести к тому, что у всех будут изображения совершенно разных размеров, которые будут называться «some_funny_kitty.jpg»), то синтаксический анализ может стать тривиальным. Это будет использовать URL-адрес, например http://example.com/IMG/w200/h100/folder1/my_w2000_desktop.jpg. Удалите знак "-" из правила RewriteRule (просто ^IMG(.*)$и измените синтаксический анализ в PHP:

$parts=explode("/",$_REQUEST["parse"]);
$filename=array_pop($parts);
$folder=array_pop($parts);
foreach ($parts as $field) {
  $param=substr($field,0,1);
  $setting=substr($field,1); // assuming settings are always one letter followed by value
  $values[$param]=$setting;
}

Если который допустимо, вы можете полностью исключить mod_rewrite: используйте URL-адреса формы

http://example.com/imgcpu/w200/h100/folder1/my_w2000_desktop.jpg

и Apache выполнит imgcpu с PATH_INFO переменная среды установлена ​​в /w200/h100/folder1/my_w2000_desktop.jpg ($_SERVER["PATH_INFO"] в PHP). Это отлично работает для меня, но я видел несколько сообщений с жалобами на то, что в определенных средах PATH_INFO не работает.