Como excluir RewriteMap se REQUEST_URI não for encontrado

3

Eu tenho um site wordpress antigo que estou em processo de migração.

Existem cerca de 50000 URLs que precisam de ser redirecionados.

Para isso estou usando arquivos DBM que parecem estar funcionando bem, no entanto, durante o teste de carga, notei que estou perdendo cerca de 0,5 segundos em cada solicitação.

Revendo os logs, parece que o arquivo DBM que tem o 50000 está sendo atingido todas as vezes.

Mudei o DBM de 50000 para 10000 e observei que ganhei cerca de 0,25 segundos em cada solicitação do arquivo do 50000 DBM.

Eu gostaria de poder fazer algo assim, mas não importa como eu misturo e combino o código, não consigo trabalhar:

<If "%{REQUEST_URI} =~ m#^abc#">
    RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm"
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond ${abcredirects:$1} !=""
        RewriteRule ^(.*) /${abcredirects:$1} [R=301,L]
    </IfModule>
</If>

<If "%{REQUEST_URI} =~ m#^xyz#">
    RewriteMap xyzredirects "dbm:/etc/httpd/conf/dbm/xyzredirects.dbm"
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond ${xyzredirects:$1} !=""
        RewriteRule ^(.*) /${xyzredirects:$1} [R=301,L]
    </IfModule>
</If>

Usando o código acima como sudo Como posso fazer isso funcionar?

ie.

Se url example.com/abc12345.htm procurar em abcredirects.dbm , saia para o VirtualHost

Se url example.com/xyz12345.htm procurar em xyzredirects.dbm , saia para o VirtualHost

Se url example.com/abc12345.htm NÃO procurar em xyzredirects.dbm

Se url example.com/xyz12345.htm NÃO procurar em abcredirects.dbm

Se url example.com/hik12345.htm NÃO procurar em xyzredirects.dbm ou abcredirects.dbm

NÃO .htaccess infelizmente não consigo usar um .htaccess

A declaração do Apache If não está funcionando

    
por Donna Delour 21.11.2018 / 17:19

1 resposta

0

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 or example.com/abc12345.htm or example.com/dir/dir/abc12345.xml, example.com/dir/abc12345.xml. The only constant in the URL would be abc.

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]
    
por 21.11.2018 / 20:27