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.htmorexample.com/abc12345.htmorexample.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]