это заноза в заднице-проблема !! Дано: большинство прокси не кэшируют ресурсы с "?" в их 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 не работает.