Como 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 ativar esse comportamento em .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, portanto, há apenas um redirecionamento. Por exemplo:
RewriteRule ^(.*)_(.*)_(.*)_(.*?)(?:/|\.html)?$ /$1-$2-$3-$4/ [R,L]
RewriteRule ^(.*)_(.*)_(.*?)(?:/|\.html)?$ /$1-$2-$3/ [R,L]
RewriteRule ^(.*)_(.*?)(?:/|\.html)?$ /$1-$2/ [R,L]
Isso lida com os URLs que terminam com uma barra e os que não (quando nenhuma extensão .html
é fornecida) - como mencionado nos comentários. Uma barra final é sempre incluída na substituição .
Notas adicionais:
(.*?)
- O ?
no último grupo capturado torna o regex não-ganancioso. Isso é necessário para não capturar a barra final ou a extensão .html
(se houver). Isto é deixado para o grupo de não captura que segue ...
(?:/|\.html)?
- Este é um grupo de não captura ( ?:
) que é opcional (trailing ?
). Usando alternância, ela corresponde a uma barra final ou à extensão .html
final ou a nada.