Apache: Qual é a melhor maneira de lidar com milhares de redirecionamentos permanentes?


20

Temos uma lista de 3000 301 redirecionamentos. Precisamos de assistência em

  1. Qual seria o melhor lugar para colocá-los? Parece que colocar essas 3000 linhas dentro do vhost no httpd.conf seria uma bagunça.
  2. Quais são as formas recomendadas de lidar com milhares de URLs?
  3. Quanto isso afetará a velocidade de carregamento da página e a carga do servidor apache?

Obrigado.

Respostas:


29

Você pode usar a Includediretiva httpd.confpara manter os redirecionamentos em outro arquivo. Mas isso não seria muito eficiente, pois cada solicitação precisaria ser comparada com muitas expressões regulares. Além disso, seria necessário reiniciar o servidor após cada alteração no arquivo.

Uma maneira melhor para tantos redirecionamentos seria usar a diretiva RewriteMap do tipo dbmpara declarar um mapa dos URIs para redirecionamentos. Dessa forma, será eficiente, pois as pesquisas no dbm são muito rápidas e, após uma alteração no mapa, você não precisaria reiniciar um servidor, pois httpdverifica o tempo de modificação do arquivo do mapa.

As regras de reescrita seriam assim (testadas no meu computador Fedora 16):

RewriteEngine On
RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

E o mapa dbm seria criado a partir do mapa de texto, /etc/httpd/conf/redirects.txtassim:

/foo http://serverfault.com/
/bar/lorem/ipsum/ http://stackoverflow.com/

usando um comando

httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db

Obrigado pela resposta. Eu tentei, mas recebendo erros: o meu uma linha de conteúdo do arquivo redirects.txt (espaço valores separados) mydomain.com/experiment mydomain.com/new_page Ele me deu erro de análise on line 'RewriteCond $ {redirecionamentos: $ 1}! = ""' . Erro de sintaxe na linha 314 de /usr/local/apache/conf/httpd.conf: RewriteCond: delimitadores de sinalizadores inválidos Eu comentei isso e o apache foi iniciado, mas visitar mydomain.com/experiment (ou qualquer outro URL do meu domínio) me deu erro "solicitação está sendo redirecionada de uma forma que não pôde ser concluída".
Ucker

O Apache não está reiniciando com o snippet acima. Poderia ajudar por favor? Não consigo ver nenhum erro relacionado a isso em nenhum dos arquivos de log.
Ucker

Eu disse que não havia sido testado - esperava que fosse necessário algum ajuste. Eu pensei que seria o suficiente, desculpe. O Httpd não foi iniciado, pois não pode haver um espaço entre !=e ""- Corrigi meu exemplo para uma versão funcional e testada agora.
Tometzky

Mais um comentário: você precisaria usar uma abordagem diferente se seus redirecionamentos precisassem depender de cadeias de consulta (tudo depois ?no URL), mas também é possível . Como agora, basta adicionar uma string de consulta para redirecionar, por exemplo http://yourserver.com/foo?q=bar, redirecionar para http://serverfault.com/?q=bar.
precisa saber é o seguinte

Obrigado pela atualização. RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.dbdeu erro RewriteMap dbm type db is invalid. Mas quando eu usei RewriteMap redirects txt:/etc/httpd/conf/redirects.txtfuncionou. Eu ainda quero seguir o caminho hash como você explicou, em vez de texto simples. Mas não consegui encontrar muito sobre o erro dbm. Obrigado pela ajuda.
Ucker 6/08

2

Eu escreveria um script que gera um novo VHOST com apenas os links da lista.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.