Existe um bug no aplicativo Discourse relacionado à atualização do elemento de metadados <link rel="canonical"> na seção <head> do DOM do Discourse.
Basicamente, quando um cliente de navegador acessa o aplicativo e ele é carregado pela primeira vez, o elemento <link rel="canonical" href=""> será definido de acordo com esse carregamento inicial da página; mas, em seguida, quando um usuário clica no aplicativo (comportamento normal do usuário), sem recarregar a página manualmente, o link <link rel="canonical"> não será atualizado.
Testei esse bug e o reproduzi no site meta:
Fig 1. Acesse o meta a partir da página inicial; o link canônico está correto, assim como o elemento de título.
Esse bug pode afetar negativamente o SEO porque, quando o Google indexa a página, se o Googlebot não estiver fazendo um “recarregamento forçado” em cada página, as informações canônicas estarão incorretas para cada página (como nas sequências de imagens acima).
Reprodutibilidade
Reproduzi esse bug consistentemente tanto no site meta quanto no nosso site.
Observações
Já vi esse tipo de problema de ciclo de vida do node.js (SPA) antes com outros frameworks web (não apenas o Ember), onde elementos do DOM não são atualizados com base nos hooks de ciclo de vida do framework de aplicação web (Ember e outros frameworks SPA).
Entregamos um documento completamente diferente para os rastreadores, pois nem todos conseguem executar JavaScript e queremos que o Discourse seja acessível a esses clientes também. Mesmo que recebam funcionalidades reduzidas, eles poderão consumir todo o conteúdo.
Agora, percebo que algumas discussões anteriores sobre SPA, “scroll infinito” e outros problemas relacionados a SEO estavam completamente equivocadas, já que o SPA não é servido ao GoogleBot.
Isso muda minha abordagem em relação a algum código personalizado que escrevi recentemente; e agora sei que preciso verificar usando o User-Agent do GoogleBot no console.
Qual é a melhor maneira de adicionar um único arquivo JavaScript personalizado ao HTML que é renderizado para o GoogleBot?
Existe uma “forma padrão” de modificar o HTML servido aos bots?
A razão pela qual pergunto é que temos algum código personalizado criado em um plugin que escrevi (destinado aos bots); mas verifiquei usando o User-Agent do GoogleBot no console (mais uma vez, obrigado por me dizer que precisava fazer isso), e nenhum desse código personalizado do plugin é consumido pelo GoogleBot.
Enquanto isso, como não consigo realizar o que desejo em um plugin (baseado em Handlebars) para HTML servido aos rastreadores, decidimos simplesmente remover as tags canônicas do Discourse, o que é uma solução parcial por enquanto, até que eu descubra como modificar a tag canônica com algum JavaScript para rastreadores da web.
O Discourse oferece um mecanismo interessante para esse tipo de alteração nos arquivos yml do container, e foi isso que fiz hoje.
Agradeço muito ao meta do Discourse por destacar que o aplicativo do Discourse servido aos rastreadores (identificados) não é o mesmo que as páginas servidas aos usuários.
Vale ressaltar que não estou recomendando essa “solução provisória” para outros administradores de sistema do Discourse. Estou apenas compartilhando o que decidi fazer no momento e como fiz (até que consigamos uma solução mais interessante).