C'è una soluzione elegante per riscrivere l'image di lunga durata? Query-urls in cachable_nice_urls, utilizzando solo apache htaccess?

questo è un dolore nel problema degli asini! Quale genio risolve questo enigma riceverà la donazione paypal per mangiare il diner per due. Permetta ora di iniziare. Dato: la maggior parte dei proxy, non memorizza la cache di risorse con un "?" nel loro URL, anche se in risposta è presente un controllo di cache: l'intestazione pubblica. Per triggersre la cache proxy per queste risorse, devo rimuovere le stringhe di query dai riferimenti a risorse statiche e invece codificare i parametri nei nomi di file stessi. *

HA PRECEDENTE HAD

<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" /> 

ADESSO LAVORO

 <img src"/IMG-folder/photo_w100_h100_cf_q60.jpg"/> 
  • Le immagini risiedono in una cartella profonda sulla radice (mai più profonda)
  • l'img.php? src = o img? src = sarà sempre chiamato per sempre
  • dopo che i …. jpg e w, h, & q, & m, & f e & c sono le uniche lettere che richiedono variables (ad esempio: & w = 200 & h & = 50 & c = p & f = bw & q = 90)

A COSTO DEL CODICE UN-ELEGANTE

 # 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] 

Tuttavia, infinite altre possibilità sono ancora scoperte: per esempio non copre i casi in cui prima viene data l'altezza la width ecc. Questo non funziona! Come posso redirect il parametro OPTIONALLY ALL? & w = o & h = con qualcosa di simile & [az] = (. *) sothat _h o _w o _m sono tutti universali e opzionali e quando somministrati interpellati dagli urli ricchi e proxy friendly?

Così l'assegnazione Ora è:
Riscrivere una o tutte le query che seguono [photo123.jpg]&[az]=(.*)&[az]=(.*)etcettera in photo123_X-x_Y-y(optionally more queries).jpg

2 Solutions collect form web for “C'è una soluzione elegante per riscrivere l'image di lunga durata? Query-urls in cachable_nice_urls, utilizzando solo apache htaccess?”

Suggerisco di sostituire progressivamente i campi. Qualcosa lungo le linee di:

(non testato)

 # 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 

e così via fino a quando non riceverai tutti i campi convertiti uno per uno invece di cercare di farli tutti contemporaneamente. Ogni regola verrà applicata successivamente. Questo dovrebbe funzionare per i campi in qualsiasi ordine e consentire loro di essere facoltativi.

Lasciare [C] l'ultima di questa catena di regole.

Edit:

Questo è più probabile che funziona rispetto a nessuna delle nonsense che ho inviato finora:

 # 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] 

I miglior tentativi di miglioramento comportno l'asterisco prima del primo segno del dollaro che intende far funzionare le cose se il field che viene riscritto è l'ultimo nella string di query e cambia il primo [^_]* a .* . Notate come ho lasciato menzionare il più grande avvitamento fino alla fine – sperando che non sarebbe stato notato? Aspetta cosa? Avverti che cerca di essere inosservato? Parlando di non notare … Ho solo notato che i nomi di file includono sottolineature!

Modifica: Fer realz dis time – fer shur!

Edit:

Prova questo al posto del primo RewriteRule (tutte le altre righe rimangono le stesse).

 RewriteRule ^IMG-(.+\/.*?)(_[hw]\d+)([^.]*)(\.[^.]+)$/imgcpu\?src=$1$4$2$3/ [C] 

Ciò dipende dal fatto che il field di altezza o width è prima tra i campi. Potresti aggiungere altre lettere in [hw] . Si noti, tuttavia, che un nome di file come il "/IMG-folder/santa_claus_w2_elves_w200_h100_q75.jpg" (Babbo Natale con 2 elfi) non avrebbe dato risultati corretti.

Modifica (15 dicembre):

 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] 

Ho avuto una regex che ha fatto qualcosa di molto simile una volta, ma con un po 'di un formato diverso. Mi sono mollato un po ', ma questo è totalmente non testato e incompiuto (per non parlare di I frackin' HATE regex's), ma speriamo che ti farà strada:

 RewriteRule ^(.*?\IMG-)(.*)_(\?[^_]*)?_([^_]*)_([^_]*)(.*)$ /imgcpu?src=(?2$2&:\?)$4=$5$6 [LP] 

In pratica, estrae la tua prima parte dell'URL e poi continua loop fino a quando non ci sono più caratteri _ , aggiungendoli nel formato di &$1=$2 sull'URL.

Ciò significa che dovrai usare il formato di /IMG-folder1/photo_citty_w_3500_h_10_c_p_q_90.jpg ma sono sicuro che puoi risolvere questo problema per semplicemente passare un carattere piuttosto che utilizzare il sottolineatura.

Posso suggerire che ti farà vita molto più facile se il tuo delimitatore ( _ ) non viene utilizzato nella parte del nome del file dell'URL? Ci sono molti altri delimitatori che si potrebbero usare (ad esempio un) che ridurrebbe la complessità delle regole di riscrittura.

Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.