Apache2 - reescreva um monte de URLs de caminhos especificados em um URL

1

Eu preciso reescrever um monte de URLs (cerca de 100 ou mais) para fins de SEO, e pode haver mais a ser adicionado no futuro (provavelmente outro 50-100 mais tarde). Eu preciso de uma maneira flexível de fazer isso e, até agora, a única maneira que posso pensar é editar o arquivo .htaccess usando o mecanismo de reescrita.

Por exemplo, eu tenho um monte de URLs como este (observe que a string de consulta é irrelevante e dinâmica; poderia ser qualquer coisa. Eu estava apenas usando-as apenas como exemplo. Estou focando apenas no nome do caminho). -a parte entre o nome do host e a string de consulta, conforme marcado em negrito abaixo:

link seo_term1 ? utm_source = google & utm_medium = cpc & utm_campaign = seo_term link another_seo_term2 ? utm_source = facebook & utm_medium = cpc & utm_campaign = seo_term

link yet_another_seo_term3 ? utm_source = exemplo_ad_network & utm_medium = cpc & utm_campaign = seo_term link foobar_seo_term4

link blah_seo_term5 ? test = 1

etc ...

E todos eles estão sendo reescritos para (por enquanto): http://example.com/

Qual é a maneira mais eficiente / eficaz de fazer isso para que eu possa adicionar mais termos no futuro?

Uma solução que encontrei é fazer isso (no arquivo .htaccess):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ / [NC,QSA]

No entanto, o problema com esta solução é que mesmo urls inválidos (como http://example.com/blah ) serão reescritos para http://example.com ao invés de dar um código 404 (que é o que é suposto fazer de qualquer maneira). Eu ainda estou tentando descobrir como tudo isso funciona, e a única maneira que posso pensar é escrever mais 100 RewriteCond declarações (como: RewriteCond %{REQUEST_URI} =/seo_term1 [NC,OR] ) antes da diretiva RewriteRule . Por exemplo:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} =/seo_term1 [NC,OR]
RewriteCond %{REQUEST_URI} =/another_seo_term2 [NC,OR]
RewriteCond %{REQUEST_URI} =/yet_another_seo_term3 [NC,OR]
RewriteCond %{REQUEST_URI} =/foobar_seo_term4 [NC,OR]
RewriteCond %{REQUEST_URI} =/blah_seo_term5 [NC]
RewriteRule ^(.*)$ / [NC,QSA]

Mas isso não parece muito eficiente para mim. Existe uma maneira melhor?

    
por James Nine 24.06.2012 / 19:23

2 respostas

3

A primeira melhoria que você pode fazer é não precisar das linhas RewriteCond .

RewriteRule /seo_term1 / [NC,QSA]

Faz exatamente o que suas duas linhas estão fazendo agora.

A segunda melhoria que você pode fazer é usar um RewriteMap . O mapa de reescrita em si pode ser atualizado sem reiniciar o Apache.

RewriteMap seo txt:/etc/apache2/maps/seo.txt
RewriteRule (.*) ${seo:$1} [NC,QSA]

e seo.txt contêm

/seo_term1 /
/seo_term2 /

Nota: Eu não usei um RewriteMap por vários anos. A configuração acima pode precisar de alguns ajustes devido à minha memória imperfeita.

    
por 24.06.2012 / 20:58
1

Um regex deve ser bem capaz de fazer isso.

RewriteEngine on
RewriteCond %{REQUEST_URI} ^\/[^\?]+\?(?=.*(utm_source\=(google|msn|yahoo)))(?=.*(utm_medium\=(cpc|ppc)))(?=.*(utm_campaign\=[a-zA-Z0-9._-]+))
RewriteRule ^(.*)$ / [L,R=301]

O acima corresponderia apenas a uma string que contenha todos os parâmetros especificados, independentemente da string inicial (pré-?).

Editar ...

Ok, você mudou sua pergunta um pouco agora. Mas, felizmente, é ainda mais simples.

RewriteEngine on
RewriteCond %{REQUEST_URI} ^\/(seo_term1|seo_term2)(.*)?
RewriteRule ^(.*)$ / [L,R=301]

Altere / edite / adicione valores conforme necessário.

    
por 24.06.2012 / 19:59