Eu não acho que o atraso esteja na definição RewriteMap
, apenas quando a pesquisa é chamada pela primeira vez. Então, o RewriteMap
s pode ser definido no topo da sua configuração.
Parece não haver necessidade de usar uma condição <If>
, já que você pode (e deve) verificar o caminho da URL no padrão RewriteRule
.
Tente algo como o seguinte no vHost:
RewriteEngine On
RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm"
RewriteMap xyzredirects "dbm:/etc/httpd/conf/dbm/xyzredirects.dbm"
RewriteCond ${abcredirects:$1} !=""
RewriteRule ^(/abc.*) /${abcredirects:$1} [R=301,L]
RewriteCond ${xyzredirects:$1} !=""
RewriteRule ^(/xyz.*) /${xyzredirects:$1} [R=301,L]
Não há necessidade dos contêineres <IfModule>
(a menos que seu site trabalhe sem o mod_rewrite - mas esse provavelmente não é o caso).
O padrão RewriteRule
é processado primeiro. Se isso falhar, a condição anterior (que procura o mapa de reescrita) é ignorada e o processamento passa para o próximo RewriteRule
.
Se /abc12345.htm
literalmente consistir de dígitos, seguido por uma extensão .htm
, inclua isso no RewriteRule
regex para ser o mais específico possível e evitar pesquisas desnecessárias. Por exemplo:
RewriteRule ^(/xyz\d+\.htm)$ /${xyzredirects:$1} [R=301,L]
Verifique se o cache do seu navegador está limpo antes de testar. Geralmente, é mais fácil testar com redirecionamentos 302 (temporários) por esse motivo.
No entanto, se tudo isso estiver acontecendo no novo site / servidor, o que foi descrito acima provavelmente não é a melhor abordagem, pois afeta todas as solicitações, incluindo todas as solicitações de novas páginas e recursos estáticos.Com isso, muitas vezes é preferível fazer o script do redirecionamento quando o site já determinou que é um 404. Somente nesse estágio final da solicitação você deve pesquisar o novo URL no banco de dados do site e acionar o redirecionamento. Dessa forma, não afeta o desempenho "normal" do site.
ATUALIZAÇÃO:
the abc urls could be a couple different ways,
example.com/dir/dir/abc12345.htm
orexample.com/abc12345.htm
orexample.com/dir/dir/abc12345.xml
,example.com/dir/abc12345.xml
. The only constant in the URL would beabc
.
Nesse caso, altere o padrão RewriteRule
de ^(/abc.*)
para algo como:
RewriteRule (.*/abc.+\.(?:htm|xml))$ /${abcredirects:$1} [R=301,L]
Como mencionado acima, se o restante do nome de base do arquivo (antes da extensão do arquivo) sempre consistir em dígitos (0-9), será mais específico e corresponderá a \d
em vez de .
. Ou se houver sempre 5 dígitos (como em seus exemplos), então \d{5}
.
Observe que o acima captura todo o caminho de URL que corresponde (por exemplo, /dir/dir/abc12345.htm
) e este é então passado como o argumento para o seu mapa de reescrita.
RewriteRule (.*/abc\d+\.(?:htm|xml))$ /${abcredirects:$1} [R=301,L]