Застрял с перезаписью URL в htaccess с Apache: 1 правило, чтобы управлять ими всеми - PullRequest
0 голосов
/ 21 марта 2011

проверьте мои текущие изменения URL для загрузки изображений:

// Possibiities: 1 letter char, followed by `=` then the value (numbers/letters)
// w= | h= | c= | q= | f=

IMG-bla/blue_w100.jpg           >>  imgcpu?src=bla/blue.jpg&w=100
IMG-bla/blue_cp.jpg             >>  imgcpu?src=bla/blue.jpg&c=p
IMG-bla/blue_h200.jpg           >>  imgcpu?src=bla/blue.jpg&h=200
IMG-bla/blue_w50_h200_fbw.jpg   >>  imgcpu?src=bla/blue.jpg&w=50&h=200&f=bw 

По сути, я хотел бы иметь 1 Ultimate rewrite url, который дает мне свободу переписывать нижеприведенные URL с любым свойством, без необходимости жесткого кодаэта точная последовательность переписывания, с одним правилом на каждую возможность: в настоящее время мой код очень глуп, непрактичен и неполон, его нелегка, мысль работает!

// works but utterly unelegant and unpractical as well as incomplete:
RewriteRule ^IMG-(.+)_w(.+).jpg$ imgcpu\.php\?src=$1\.jpg&w=$2 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+).jpg$ imgcpu\.php\?src=$1\.jpg&w=$2&h=$3&c=$4 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_f(.+).jpg$ imgcpu\.php\?src=$1\.jpg&w=$2&h=$3&f=$4 [L]

Теперь, как мне переписать это сложное правилос необязательными имущественными активами? Я ищу это 1 правило, чтобы управлять ими всеми.Ваши идеи и предложения горячо приветствуются, и я восхищенно приветствую все, что осмелится решить эту сложную головоломку!

1 Ответ

1 голос
/ 21 марта 2011

Я обдумал несколько методов, прежде чем прийти к этому очень общему решению.Здесь я повторил одно и то же правило несколько раз.Это своего рода стратегия «разделяй и властвуй», где каждый раз, когда выполняется правило, оно извлекает один параметр.

# 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

Примечаниечто я делаю несколько предположений ...

  • Все (кроме подчеркивания, косой черты каталога и точек) представляет собой букву или цифру.Может быть слишком строг для вас, если файлы или параметры могут содержать международные символы.
  • Имена параметров всегда имеют длину одного символа, но не должны указываться в явном виде.
  • Изображения никогда не будутболее одной подпапки в глубину (легко исправить.)

Скажите, что вы думаете.

...