Realizando dois tipos de substituição no .htaccess

1

Considere um arquivo .htaccess que deve converter todos os sublinhados em traços e substituir um possível sufixo .html 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 essa regra para substituir o sufixo .html :

RewriteRule ^(.*)\.html$ $1/ [R,L]

Encontrei este ótimo serverfault.SE post para reescrever o 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 arquivo .htaccess . Não consigo configurar o .htaccess para realizar as duas substituições.

Isso significa que o código a seguir substituirá o .html suffix somente:

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 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 .htaccess deve ser configurado para substituir o sufixo .html e os sublinhados?

    
por dotancohen 08.05.2018 / 13:04

1 resposta

1

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.

    
por 10.05.2018 / 02:20