Redirecionamento infinito em URLs de tags persas codificadas em porcentagem com `slug_generation_method = encoded`

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

  1. Configure o Discourse para usar slug_generation_method = encoded.

  2. Crie ou identifique uma tag com um nome persa, por exemplo نمونه.

  3. 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

  4. 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 301 para si mesma.

  • A URL correspondente com dupla percent-encoding retornou 200.

  • Uma tag com slug latino retornou 200 usando 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.