Supondo que eu tenha os seguintes URLs:
https://mywebsite.com/pages.html?limit=24&start=7440&t=3349.html.html.html
https://mywebsite.com/pages.html.html.html?limit=24&start=8136&t=3358
https://mywebsite.com/pages.html.html?limit=24&start=8136&t=3358.html.html.html.html
Como posso me livrar das partes “.html” repetidas, deixando apenas uma?
É um caso misto e, depois de duas horas de luta, ainda não consigo encontrar uma maneira de usar um regex adequado para fazer isso funcionar.
Aqui está o que eu tentei:
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^(.*)((.html){2,})(.*)$
RewriteRule ^(.*)$ https://mywebsite.com/%1%4 [QSA,R=302,L]
Estou usando 302 porque é uma solução temporária até que eu tenha uma solução funcional para a raiz do problema, mas continuo recebendo um loop de redirecionamento.
Gostaria de deixar apenas UM .html no lugar, removendo todas as múltiplas ocorrências dele.
Exemplo 1:
https://mywebsite.com/pages.html?limit=24&start=7440&t=3349.html.html.html
should redirect to:
https://mywebsite.com/pages.html?limit=24&start=7440&t=3349.html
e
https://mywebsite.com/pages.html.html?limit=24&start=8136&t=3358.html.html.html.html
should redirect to:
https://mywebsite.com/pages.html?limit=24&start=8136&t=3358.html
Desculpe perguntar isso, mas foi particularmente complicado para mim e não consegui encontrar uma solução.
Desde já, obrigado.
Existem alguns problemas aqui:
/pages.html
)%1%4
) para o caminho da URL (não para a string de consulta). Se talvez devesse ser?%1%4
.QSA
sinalizador). Em última análise, isso causa o loop de redirecionamento..html
fosse repetido apenas uma vez na string de consulta. (Isso poderia acontecer, como aparece no caminho da URL?)Nos seus exemplos, o múltiplo
.html
sempre aparece no final do URL e/ou no final da string de consulta. Portanto, o final(.*)
do seu regex parece desnecessário (já que nada ocorre após a.html
sequência duplicada).Em vez disso, tente o seguinte:
Com essas 2 regras há no máximo 1 redirecionamento. A primeira regra trata múltiplos incorretos
.html
na string de consulta, mas também corrige o caminho da URL ao mesmo tempo. E a segunda regra trata apenas do caminho da URL (quando a string de consulta já está correta).Observe que o final
?
(.+?
parte de(.+?\.html)(\.html)*$
) torna o quantificador anterior não ganancioso, portanto, consumimos o mínimo possível. Em outras palavras, consumimos apenas uma instância de.html
no primeiro grupo de captura, em vez de tudo (ou tudo, exceto a última instância de.html
como na segunda regra).Apenas uma diferença sutil no regex entre a primeira e a segunda regras:
(.+?\.html)(\.html)*$
e(.+?\.html)(\.html)+$
respectivamente. No primeiro (*
), o final adicional.html
é opcional, mas no segundo (+
) é obrigatório.O
QSA
sinalizador não é obrigatório em nenhuma das regras. Na primeira regra reconstruímos a string de consulta, então a string de consulta original é descartada (por padrão). Na 2ª regra a string de consulta (já OK) é passada por padrão.O
NE
sinalizador é usado na primeira regra, pois a referência anterior (conforme capturada daQUERY_STRING
variável do servidor) já está codificada em URL.Um único
R
sinalizador tem como padrão 302 (temporário), embora, para facilitar a leitura, possa ser benéfico ser explícito.