Considere um .htaccess
arquivo que deve converter todos os sublinhados em traços e substitua um .html
sufixo potencial por uma barra no nome do arquivo.
Exemplo de URL do cliente: http://foo.com/a_b/c_d.html
Exemplo de URL para redirecionar:http://foo.com/a-b/c-d/
Eu tenho usado esta regra para substituir o .html
sufixo:
RewriteRule ^(.*)\.html$ $1/ [R,L]
Eu encontrei este post fantástico serverfault.SE para a reescrita de sublinhado:
RewriteRule ^(.*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4 [R,L]
RewriteRule ^(.*)_(.*)_(.*)$ /$1-$2-$3 [R,L]
RewriteRule ^(.*)_(.*)$ /$1-$2 [R,L]
No entanto, apenas um dos tipos de substituição acontece , o que ocorrer primeiro no .htaccess
arquivo. Não consigo configurar .htaccess
para realizar as duas substituições.
Isso significa que o código a seguir substituirá apenas o .html
sufixo :
RewriteRule ^(.*)\.html$ $1/ [R,L]
RewriteRule ^(.*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4 [R,L]
RewriteRule ^(.*)_(.*)_(.*)$ /$1-$2-$3 [R,L]
RewriteRule ^(.*)_(.*)$ /$1-$2 [R,L]
E o código a seguir substituirá apenas os sublinhados:
RewriteRule ^(.*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4 [R,L]
RewriteRule ^(.*)_(.*)_(.*)$ /$1-$2-$3 [R,L]
RewriteRule ^(.*)_(.*)$ /$1-$2 [R,L]
RewriteRule ^(.*)\.html$ $1/ [R,L]
Como deve .htaccess
ser configurado para substituir o .html
sufixo e os sublinhados?
Conforme mencionado nos comentários, as diretivas que você postou já devem atingir o que você precisa, embora em dois redirecionamentos separados. Não há nada que você precise fazer para habilitar esse comportamento
.htaccess
- é assim que funciona.É possível que haja algum tipo de conflito com outras diretrizes, mas estou lutando para imaginar que tipo de conflito pode resultar no comportamento que você está vendo.
No entanto, você pode combinar esses dois redirecionamentos, para que haja apenas um redirecionamento. Por exemplo:
Isso lida com URLs que terminam com uma barra e aqueles que não terminam (quando nenhuma
.html
extensão é fornecida) - conforme mencionado nos comentários. Uma barra final é sempre incluída na substituição .Notas Adicionais:
(.*?)
- O?
último grupo capturado torna a regex não gananciosa. Isso é necessário para não capturar a barra ou.html
extensão à direita (se houver). Isso é deixado para o grupo de não captura que segue...(?:/|\.html)?
- Este é um grupo sem captura (?:
) que é opcional (à direita?
). Usando a alternância, ele corresponde a uma barra ou.html
extensão à direita ou nada.