Usando um DBrite RewriteMap para reescrever milhares de URLs legados

1

A organização para a qual estou trabalhando está implementando um novo CMS. Como tal, um grande número de URLs (digamos, dezenas de milhares) será reescrito para novos. Algumas delas podem estar relacionadas ao novo padrão de URI, como:

RewriteRule ^/articles/articlename.html /new/article/taxonomy/and/such.html [R,L]

Outros, queremos passar para o back-end do CMS para que o usuário final veja a mesma URL, embora seja veiculado internamente a partir do novo caminho, como

RewriteRule ^/articles/article2.html /content/en/new/article/path/article2.html [PT,L]

Eu estava planejando colocar isso em um par de reescritos FAT DBM, de modo a lidar com os dois tipos separadamente, mas mais rápido do que apenas colocá-los lá como milhares de regras de reescrita individuais.

No entanto, não sei bem como chamá-los para que o mod_rewrite capture apenas URLs que correspondam a uma das chaves no arquivo DBM e substitua-as pelo valor.

RewriteEngine on
RewriteMap 302_rewrites dbm:/etc/httpd/conf/rewritemaps/dbmtest_302.dbm
RewriteRule ^${302_rewrites:$1} ${302_rewrites:$2} [R,L]

O acima não funciona. Mas eu estou perto?

    
por Tad 10.08.2012 / 15:19

1 resposta

1

Você não pode usar seu RewriteMap no lado esquerdo (a correspondência) de RewriteRule . Além disso, como nenhuma correspondência ocorreu nesse ponto, não há nada em $1 . Você poderia especificar um valor padrão no RewriteRule , assim:

RewriteRule ^(/articles/.*) ${302_rewrites:$1|$1} [R,L]

Isso irá procurar o caminho do pedido ( /articles/mumble/... ) no seu banco de dados, e se nada for encontrado, ele retornará o caminho original. Se nem tudo começar com /articles , você pode obviamente tornar sua correspondência mais geral:

RewriteRule ^(/.*) ...
    
por 10.08.2012 / 16:57