Obrigado a você! 🙂 Com o que descreve já é possível concretizar bastante. Sua abordagem está boa, com alguns detalhes para que as mudanças de SEO não criem problemas de URLs, renderização ou sessões.
Primeiro, esses indícios são compatíveis com Rails, mas não permitem datar a versão: uma aplicação atualizada pode conservar templates e dependências antigas. O Gemfile.lock lhe dará uma referência muito mais confiável; convém contrastá-la com o que realmente está implantado. Se for confirmado Rails 5.x, está fora da manutenção oficial e seria necessário planejar sua atualização, sem misturar uma migração grande com todas essas mudanças ao mesmo tempo.
1. Sitemap e barras duplas
Eu corrigiria onde as URLs são geradas, depois de localizar a concatenação concreta. Não daria como certo que a causa é default_host sem ver esse código.
Se usa a gem sitemap_generator, revisaria config/sitemap.rb: default_host com a URL base HTTPS, sem barra final, e as rotas geradas com os helpers *_path que são passados para add. Se é uma view .builder própria, preferiria os helpers *_url, com host e protocolo de produção configurados explicitamente quando forem executados fora de uma requisição web.
São duas formas de construir a URL; não concatenaria novamente o host na frente de um helper que já retorna uma URL completa. Tampouco faria uma substituição global de barras duplas, porque poderia estragar https://.
Depois regeneraria o XML e verificaria se suas URLs são as canônicas, respondem 200 e coincidem com os links internos. Se as variantes com barra dupla já existem publicamente e representam a mesma página, adicionaria um redirecionamento permanente para a correta, sem cadeias. Arrumar apenas o sitemap não elimina essas variantes.
2. JSON-LD, content_for e escape
Sim, content_for :json_ld nas views e yield :json_ld no layout é uma abordagem válida. Teria cuidado com a ordem: o bloco tem que estar definido antes que o layout o emita. Para mantê-lo, construiria os dados através de um helper ou presenter que leia os modelos, e deixaria a view encarregada de renderizá-los.
Para o escape, dentro da tag script de tipo application/ld+json, o padrão ERB é:
<%= raw(json_escape(datos_schema.to_json)) %>
Aqui datos_schema é o Hash/Array que você constrói com os campos públicos que quer marcar. Primeiro é serializado para JSON válido; depois json_escape protege caracteres que poderiam fechar a tag script. raw é aplicado ao resultado escapado. Não usaria .html_safe diretamente sobre texto de usuários nem despejaria um modelo completo com dados privados. Este padrão também está documentado no Rails 5.2, embora você deva contrastá-lo com a versão real do projeto.
A distribuição que propõe faz sentido: RealEstateAgent com um @id estável; RealEstateListing para a ficha, com sua Offer; ItemList para a listagem, Article para notícias e BreadcrumbList para as migalhas. Distinguiria a ficha do imóvel físico e conectaria as entidades através de @id, usando propriedades válidas para cada tipo. availability vai em Offer e deve refletir o estado real que o visitante também vê.
Pode conectar as entidades por @id, em um ou vários blocos. Não é obrigatório reunir tudo em um único script. Ao mudar o estado do imóvel, invalide também o cache da ficha para que a marcação não continue oferecendo algo vendido.
Substituiria a marcação data-vocabulary.org obsoleta, conservando o conteúdo visível do footer que seja necessário. E validaria duas coisas distintas: o vocabulário com Schema Markup Validator e a elegibilidade dos tipos que o Google admite com seu teste de resultados enriquecidos. Um RealEstateListing válido não garante um resultado especial no Google.
3. Entidades e sameAs
Não há um mínimo de cinco sameAs. Colocaria apenas referências que identifiquem inequivocamente essa mesma entidade: perfis oficiais ou fichas confiáveis, se existirem. Não preencheria a lista com diretórios duvidosos para alcançar uma quantidade.
about para a Organization correspondente encaixa se essa página realmente trata sobre ela. Manteria @id distintos para a agência, cada grupo empresarial e cada imóvel. Compartilhar nome ou pertencer ao mesmo grupo não torna duas sociedades a mesma entidade. Essa coerência ajuda a descrevê-las; não garante por si só sua reconciliação no Google.
4. Slug + ID e redirecionamento
Sim: se várias URLs representam exatamente a mesma notícia, redirecionaria as variantes para sua URL canônica. Faria isso na ação de leitura, depois de carregar o registro e verificar se é público e acessível, gerando o destino com o helper e o slug canônico do próprio registro.
Compararia a rota recebida com essa rota canônica; não construiria o destino com um host ou uma URL fornecidos pelo visitante. Para GET/HEAD, um 301 é adequado. Não estenderia essa regra indiscriminadamente para formulários ou requisições POST.
O teste seria: slug correto retorna 200; slug inventado com ID válido retorna um único redirecionamento para a notícia correta; ID inexistente retorna 404; e não aparece nenhum loop. Depois alinharia canonical, links internos e sitemap com esse mesmo destino.
5. WAF, CSRF, reCAPTCHA e cache
Pode colocar Cloudflare na frente do Rails, mas não esperaria para posicionar para revisar a segurança. Se há componentes sem suporte, o WAF complementa a atualização.
Começaria com cache de estáticos e exclusões claras para login, administração, respostas personalizadas e formulários com tokens de sessão. Evitaria um Cache Everything global: compartilhar HTML com um token CSRF entre visitantes pode quebrar formulários ou expor conteúdo de outra sessão.
Manteria a proteção CSRF do Rails e a validação de reCAPTCHA no servidor. Se algo falhar ao ativar o proxy, revisaria cookies, cache, protocolo e regras concretas antes de desativar essas validações.
Também verificaria HTTPS até a origem, sem modo Flexible; que o Rails receba o host/protocolo corretos através de proxies de confiança; e que o IP do cliente seja obtido de cabeçalhos confiáveis, não de qualquer cabeçalho enviado pelo visitante. Se o WAF deve proteger todo o tráfego web, é preciso controlar também o acesso direto à origem.
Testaria navegação e envio de formulários com duas sessões independentes, sessão iniciada/encerrada, reCAPTCHA e rastreamento das páginas públicas. As exceções do WAF são ajustadas sobre bloqueios comprovados, não desativando-o inteiro.
Faria isso por pequenas mudanças em um ambiente de testes: primeiro geração de URLs e redirecionamentos, depois marcação por tipo de página e por último regras de proxy/cache. Assim você pode verificar cada efeito e revertê-lo sem misturar causas.
Deixo as referências para contrastar com a agência:
Escape JSON no Rails:
Configuração de sitemap_generator:
SitemapGenerator is a framework-agnostic XML Sitemap generator written in Ruby with automatic Rails integration. It supports Video, News, Image, Mobile, PageMap and Alternate Links sitemap extensio...
github.com
Definição de sameAs:
Schema.org Property: sameAs - URL of a reference Web page that unambiguously indicates the item's identity. E.g. the URL of the item's Wikipedia page, Wikidata entry, or official website.
schema.org
Canonicalização e redirecionamentos:
Si en un sitio hay contenido duplicado, Google elige la URL canónica. Consulta más información sobre las URLs canónicas y cómo unificar URLs duplicadas.
developers.google.com
Cache, sessões e CSRF com Cloudflare:
Troubleshoot login failures, missing session cookies, and challenge loops caused by caching dynamic content.
developers.cloudflare.com