Existe uma solução elegante para reescrever urls de consulta de imagens longas em cachable_nice_urls, usando somente o htaccess do apache?

3

esta é uma dor no problema da bunda! Qualquer gênio que resolver esse enigma receberá doação em paypal para comer lanchonete para dois. Agora vamos começar. Dado: a maioria dos proxies, não armazena em cache recursos com um "?" em sua URL, mesmo que um cabeçalho Cache-control: public esteja presente na resposta. Para habilitar o cache de proxy para esses recursos, tenho que remover cadeias de consulta de referências a recursos estáticos e, em vez disso, codificar os parâmetros nos próprios nomes de arquivo. *

ANTERIORMENTE TEVE

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

AGORA TRABALHANDO

<img src"/IMG-folder/photo_w100_h100_cf_q60.jpg"/>
  • As imagens residirão em uma pasta na raiz (nunca mais profunda)
  • o img.php? src = ou img? src = será nomeado constantemente para sempre
  • depois que .... jpg & w, & h, & q, & m, & f e & c são as únicas letras que exigem variáveis (por exemplo: & w = 200 & h & = 50 & c = p & f = bw & q = 90) mas todos devem ser opcionais

NO CUSTO DESTE CÓDIGO NÃO-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]

No entanto, infinitas outras possibilidades ainda são descobertas: por ex. não cobre os casos em que primeiro a altura é dada a largura etc Não, isso não deve funcionar! Como posso redirecionar o parâmetro OPTIONALLY ALL? & w = ou & h = com algo como & [a-z] = (. *) sothat _h ou _w ou _m são universais e opcionais e, quando fornecidos, são reescritos pelos URLs reescritos e compatíveis com proxy?

Portanto, a tarefa Agora é:
Reescreva qualquer uma ou todas as consultas que seguem [photo123.jpg]&[a-z]=(.*)&[a-z]=(.*)etcettera em photo123_X-x_Y-y(optionally more queries).jpg

    
por Sam 06.12.2010 / 03:19

2 respostas

1

Eu sugeriria substituir progressivamente os campos. Algo ao longo das linhas de:

(não testado)

# 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 assim por diante, até que todos os campos sejam convertidos um a um, em vez de tentar todos de uma só vez. Cada regra será aplicada sucessivamente. Isso deve funcionar para campos em qualquer ordem e permitir que eles sejam opcionais.

Deixe o [C] da última desta cadeia de regras.

Editar:

É mais provável que isso funcione do que qualquer bobagem que publiquei até agora:

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

As principais tentativas de aprimoramento envolvem o asterisco antes do primeiro sinal de dólar, que tem a intenção de fazer as coisas funcionarem, se o campo que está sendo reescrito for o último da string de consulta e alterar o primeiro [^_]* to .* . Repare como eu deixei de mencionar o maior estratagema até o fim - esperando que não fosse notado? Espere o que? Observe que está tentando passar despercebido? Falando em não notar ... Eu só notei que os nomes dos arquivos incluem sublinhados!

Editar: Tempo real de tempo real - por fim!

Editar:

Tente isso no lugar do primeiro RewriteRule (todas as outras linhas permanecem as mesmas).

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

Isso depende do campo de altura ou largura ser o primeiro entre os campos. Você pode adicionar mais letras em [hw] . Note, no entanto, que um nome de arquivo como o "/IMG-pasta/santa_claus_w2_elves_w200_h100_q75.jpg" forjado (/ Papai Noel w / 2 elfos) não daria resultados corretos.

Editar (15 de dezembro):

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]
    
por 06.12.2010 / 05:58
1

Eu tive um regex que fez algo muito semelhante uma vez, mas com um formato diferente. Eu mucked com isso um pouco, mas isso é totalmente não testado e inacabado (para não mencionar que eu freakin regex HATE), mas espero que você irá definir no seu caminho:

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

Basicamente, ele extrairá sua primeira parte do URL e continuará em loop até que não haja mais _ caracteres, anexando-os no formato &$1=$2 no URL.

Isto significa que você terá que usar o formato /IMG-folder1/photo_citty_w_3500_h_10_c_p_q_90.jpg , mas eu tenho certeza que você poderia consertar isso simplesmente para escalar um caracter ao invés de usar o sublinhado.

Posso sugerir que você tornará sua vida muito mais fácil se o delimitador ( _ ) não for usado na parte do nome do arquivo do URL? Há muitos outros delimitadores que você poderia usar (como - ) que reduziriam a complexidade de suas regras de reescrita.

    
por 07.12.2010 / 06:21