Resumo
Páginas de tags com slugs persas percent-encoded podem entrar em um loop infinito de redirecionamentos HTTP quando o Discourse é configurado com slug_generation_method = encoded.
O slug armazenado da tag e a URL gerada parecem consistentes, mas ao solicitar a URL canônica, ocorre um redirecionamento 301 Moved Permanently para exatamente a mesma URL.
Ambiente
-
Discourse: instalação self-hosted
-
Método de geração de slug:
encoded -
Idioma: Persa (Farsi), utilizando caracteres não-ASCII
-
Rota afetada:
/tag/:tag_slug/:tag_id
Passos para Reproduzir
-
Configure o Discourse para usar
slug_generation_method = encoded. -
Crie ou identifique uma tag com um nome persa, por exemplo
نمونه. -
Abra a URL canônica da tag, usando seu slug e ID reais. Por exemplo:
/tag/%D9%86%D9%85%D9%88%D9%86%D9%87/123 -
Inspecione a resposta HTTP.
Comportamento Real
A solicitação retorna 301 Moved Permanently, com o cabeçalho Location apontando para exatamente a mesma URL. Seguir o redirecionamento repetidamente produz um loop infinito de redirecionamentos, e a página da tag não pode ser aberta diretamente.
No ambiente observado, as seguintes comparações foram feitas:
-
A URL percent-encoded canônica da tag persa retornou
301para si mesma. -
A URL correspondente com dupla percent-encoding retornou
200. -
Uma tag com slug latino retornou
200usando sua URL canônica.
Comportamento Esperado
A URL canônica para uma tag persa deve retornar a página da tag com sucesso, sem redirecionar para si mesma.
Se o slug solicitado não for canônico, o Discourse deve redirecionar para a URL canônica correta uma única vez, em vez de redirecionar repetidamente para a mesma URL.
Código Relevante
Em TagsController#should_redirect_tag?, a rota baseada em ID compara o slug solicitado diretamente com o slug da URL armazenado:
params[:tag_slug] != tag.slug_for_url
Por comparação, TopicsController#slugs_do_not_match lida explicitamente com o método de geração de slug encoded:
if SiteSetting.slug_generation_method != "encoded"
params[:slug] && @topic_view.topic.slug != params[:slug]
else
params[:slug] && CGI.unescape(@topic_view.topic.slug) != params[:slug]
end
Essa diferença sugere que a comparação de slugs de tags pode não considerar corretamente os slugs não-ASCII percent-encoded quando slug_generation_method = encoded.
Causa Provável
O controlador de tags pode estar comparando o parâmetro de rota decodificado com o slug armazenado percent-encoded, fazendo com que a comparação falhe mesmo quando a solicitação usa a URL canônica. O redirecionamento resultante então aponta de volta para a mesma URL.
Esta é uma hipótese baseada no comportamento HTTP observado e na comparação do código.
Correção Sugerida
Seria possível que a comparação de slugs de tags lidasse com slug_generation_method = encoded de forma consistente com a comparação de slugs de tópicos?
Por favor, considere também adicionar especificações de requisição que cubram:
-
URLs canônicas para tags com nomes persas ou outros não-ASCII.
-
Renderização bem-sucedida de URLs canônicas percent-encoded de tags.
-
Redirecionamentos corretos para slugs genuinamente não-canônicos.
-
Prevenção de redirecionamentos para exatamente a mesma URL.
Impacto
Os usuários podem ser incapazes de abrir diretamente ou em uma nova aba do navegador as páginas de tags persas afetadas. O problema também pode afetar links para essas páginas vindos de outras partes do fórum.
Agradeceria a confirmação de se este comportamento é reproduzível e se uma correção ou teste de regressão seria apropriado.