это боль в заднице-проблема! Какой бы гений ни разгадал эту загадку, он получит пожертвование PayPal на ужин на двоих. Теперь приступим. Дано: большинство прокси не кэшируют ресурсы с "?" в их URL, даже если в ответе присутствует заголовок Cache-control: public. Чтобы включить прокси-кеширование для этих ресурсов, мне нужно удалить строки запроса из ссылок на статические ресурсы и вместо этого закодировать параметры в самих именах файлов. *
ПРЕДЫДУЩИЙ БЫЛ
<img src="/imgcpu?src=folder1/photo_citty.jpg&w=3500&h=10&c=p&q=90" />
<img src="/imgcpu?src=folder2/photo_doggy.jpg&w=100&h=200&c=p" />
<img src="/imgcpu?src=folder3/photo_birds.jpg&w=200&h=500&f=bw" />
<img src="/imgcpu?src=folder3/photo_frogs.jpg&h=200" />
СЕЙЧАС РАБОТАЕТ
<img src"/IMG-folder/photo_w100_h100_cf_q60.jpg"/>
ЗА СТОИМОСТЬ ЭТОГО НЕЭЛЕГАНТНОГО КОДЕКСА
# Rewrite imgcpu?src= thumbnail maker to nice static urls
RewriteCond %{REQUEST_URI} ^IMG.*$
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(.+)_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(.+).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]
Тем не менее, бесконечные другие возможности все еще открыты: например, не распространяется на случаи, когда сначала указывается высота, ширина и т. д. Нет, это не сработает! Как я могу перенаправить ОБЯЗАТЕЛЬНО ВСЕ параметры? & w = или & h = с чем-то вроде & [a-z] = (. *), чтобы _h, _w или _m были универсальными и необязательными, и когда они прерываются переписанными, дружественными к прокси URL-адресами?
Итак, задание сейчас:
Перепишите любой или все последующие запросы. [photo123.jpg]&[a-z]=(.*)&[a-z]=(.*)etcettera
в photo123_X-x_Y-y(optionally more queries).jpg
У меня было регулярное выражение, которое однажды делало что-то очень похожее, но с немного другим форматом. Я немного поработал с этим, но это полностью непроверено и незакончено (не говоря уже о том, что я ломаю регулярные выражения HATE), но, надеюсь, это поможет вам:
RewriteRule ^(.*?\IMG-)(.*)_(\?[^_]*)?_([^_]*)_([^_]*)(.*)$ /imgcpu?src=(?2$2&:\?)$4=$5$6 [LP]
По сути, он будет извлекать вашу первую часть URL-адреса, а затем продолжать цикл до тех пор, пока не закончится _
символов, добавляя их в формате &$1=$2
на URL-адрес.
Это будет означать, что вам придется использовать формат /IMG-folder1/photo_citty_w_3500_h_10_c_p_q_90.jpg
но я уверен, что вы могли бы исправить это, просто перейдя на один символ, а не используя подчеркивание.
Могу я предложить вам жизнь так много проще, если ваш разделитель (_
) не используется в части имени файла URL-адреса? Вы можете использовать множество других разделителей (например, -
), что снизит сложность ваших правил перезаписи.
Я предлагаю постепенно заменять поля. Что-то вроде:
(непроверено)
# Rewrite imgcpu?src= thumbnail maker to nice static urls
RewriteCond %{REQUEST_URI} ^IMG.*$
RewriteRule ^IMG-(.+)_w([^_]+)(_.*)$ imgcpu\?src=$1\.jpg&w=$2$3 [C]
RewriteRule ^(imgcpu[^_]*)_h([^_]+)(_.*)$ $1&h=$2$3 [C]
RewriteRule ^(imgcpu[^_]*)_q([^_]+)(_.*)$ $1&q=$2$3
и так далее, пока вы не сконвертируете все поля одно за другим, вместо того, чтобы пытаться сделать их все сразу. Каждое правило будет применяться последовательно. Это должно работать для полей в любом порядке и позволять делать их необязательными.
Оставь [C]
от последнего из этой цепочки правил.
Редактировать:
Скорее всего, это сработает, чем какая-либо ерунда, которую я опубликовал:
# Rewrite imgcpu?src= thumbnail maker to nice static urls
RewriteCond %{REQUEST_URI} ^IMG.*$
RewriteRule ^IMG-(.+\/photo_[^_]+)(_.*)*(\.[^.]+)$ imgcpu\?src=$1$3$2/ [C]
RewriteRule ^(imgcpu.*\..+)_w([^_]+)(_.*)*$ $1&w=$2$3 [C]
RewriteRule ^(imgcpu.*\..+)_h([^_]+)(_.*)*$ $1&h=$2$3 [C]
RewriteRule ^(imgcpu.*\..+)_q([^_]+)(_.*)*$ $1&q=$2$3 [C]
RewriteRule ^(imgcpu.*\..+)_c([^_]+)(_.*)*$ $1&c=$2$3 [C]
RewriteRule ^(imgcpu.*\..+)_m([^_]+)(_.*)*$ $1&m=$2$3 [C]
RewriteRule ^(imgcpu.*\..+)_f([^_]+)(_.*)*$ $1&f=$2$3 [C]
Основные попытки улучшения включают в себя звездочку перед первым знаком доллара, которые предназначены для того, чтобы все работало, если перезаписываемое поле является последним в строке запроса и изменяет первое. [^_]*
к .*
. Обратите внимание, как я оставил упоминание о самом большом провале до последнего - надеясь, что его не заметят? Чего ждать? Заметили, что он пытается остаться незамеченным? Кстати о том, чтобы не замечать ... Я только что заметил, что имена файлов включить подчеркивание!
Редактировать: Fer realz dis time - fer shur!
Редактировать:
Попробуйте это вместо первого RewriteRule
(все остальные строки остаются прежними).
RewriteRule ^IMG-(.+\/.*?)(_[hw]\d+)([^.]*)(\.[^.]+)$/imgcpu\?src=$1$4$2$3/ [C]
Это зависит от того, стоит ли поле высоты или ширины первым среди полей. Вы можете добавить больше букв в [hw]
. Обратите внимание, однако, что такое имя файла, как надуманная "/IMG-folder/santa_claus_w2_elves_w200_h100_q75.jpg" (Санта-Клаус с двумя эльфами), не даст правильных результатов.
Изменить (15 декабря):
RewriteCond %{QUERY_STRING} ^(.*\.[^_]*)_(.)([^_]*)(_.*)?$
RewriteRule ^/imgcpu /imgcpu?%1&%2=%3%4 [N]
RewriteCond %{REQUEST_URI} ^/IMG.*$
RewriteRule ^/IMG-(.+/.*?)(_[hw]\d+)([^.]*)(\.[^.]+)$ /imgcpu?src=$1$4$2$3 [N]