Я обдумал несколько методов, прежде чем прийти к этому очень общему решению.Здесь я повторил одно и то же правило несколько раз.Это своего рода стратегия «разделяй и властвуй», где каждый раз, когда выполняется правило, оно извлекает один параметр.
# Generic rule for extracting one parameter
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
# Final rule which does the actual rewrite
RewriteRule IMG-([a-z0-9]+/[a-z0-9]+\.jpg) /test/index.php?src=$1 [QSA]
Давайте разберем правило D & C на более мелкие части!
^(IMG-[a-z0-9]+/[a-z0-9]+)
Эта часть соответствует, но сохраняется.В результате получается 1 доллар.
_
Одно подчеркивание.Это совпадает, но отбрасывается.
([a-z0-9])
соответствует одной букве или цифре (очевидно, после знака подчеркивания).Это $ 2 и предполагается, что это имя параметра.
([a-z0-9]+)
соответствует одной или нескольким буквам или цифрам.В результате получается $ 3, и предполагается, что это значение параметра.
([_.].*)$
соответствует одному подчеркиванию или периоду и всему остальному до конца строки запроса.Это $ 4.
Таким образом, для каждого шага извлекается один параметр (если есть совпадение), который затем добавляется к строке запроса с помощью QSA.Оставшаяся часть запроса, $ 1 $ 4, объединяется и готовится к следующему раунду.Промойте и повторяйте до тех пор, пока у нас не будет параметров или не достигнете максимального количества доступных правил.
Окончательное правило соответствует тому, каким должен быть путь и имя файла к тому времени.Это следующие шаги:
IMG-bla/blue_w50_h200_fbw.jpg -> IMG-bla/blue_h200_fbw.jpg?w=50 [with QSA]
IMG-bla/blue_h200_fbw.jpg -> IMG-bla/blue_fbw.jpg?h=200 [with QSA]
IMG-bla/blue_fbw.jpg -> IMG-bla/blue.jpg?f=bw [with QSA]
(более общие правила не будут соответствовать)
IMG-bla/blue.jpg -> /test/index.php?src=bla/blue.jpg [with QSA]
Общая сумма после добавления строк запроса:
/test/index.php?src=bla/blue.jpg&f=bw&h=200&w=50
Примечаниечто я делаю несколько предположений ...
- Все (кроме подчеркивания, косой черты каталога и точек) представляет собой букву или цифру.Может быть слишком строг для вас, если файлы или параметры могут содержать международные символы.
- Имена параметров всегда имеют длину одного символа, но не должны указываться в явном виде.
- Изображения никогда не будутболее одной подпапки в глубину (легко исправить.)
Скажите, что вы думаете.