Regras de URL e título portadas do PHP
Portei para TypeScript as funções do PHP que geram slugs e títulos, incluindo detalhes como o strtolower do PHP, que só altera letras ASCII. Os comentários do código apontam os 14 arquivos .inc.php de origem.
Refiz o site da REDD, um catálogo de brindes que vende por orçamento. Mantive os endereços e os títulos das páginas antigas para não perder o que o Google já conhece. A versão nova está em testes e ainda não substituiu a antiga.
Site antigo × site novo
A mesma URL pedida aos dois sites, 4 por vez
| Caminho | Status | H1 |
|---|---|---|
| / | 200 | igual |
| /brindes/canecas-e-copos | 200 | igual |
| /brinde/1234-caneca-personalizada | 200 | igual |
| /brindes/garrafas/30/60 | 200 | igual |
| /home | 308 → / | — |
O site antigo, em PHP, já tem tráfego orgânico, e o banco dele é o MySQL que outros sistemas da empresa também usam. Refazer tinha duas restrições: manter as URLs e os títulos que o Google já conhece e não gravar nada nesse banco. O que o PHP gravava, como carrinho e orçamentos, passou para o navegador e para o e-mail.
Portei para TypeScript as funções do PHP que geram slugs e títulos, incluindo detalhes como o strtolower do PHP, que só altera letras ASCII. Os comentários do código apontam os 14 arquivos .inc.php de origem.
O site lê o MySQL que outros sistemas da empresa também usam. A consulta só aceita leitura, cada conexão abre em modo somente leitura e múltiplos comandos ficam desligados. A entrada do usuário entra sempre por placeholder.
Slug errado leva com redirect permanente para a URL canônica, produto desativado leva para a listagem do tipo e endereço inexistente devolve 404. URLs antigas com caracteres em latin1, que o Next recusaria, são convertidas e redirecionadas.
A primeira página de cada listagem vem pronta do servidor e as seguintes chegam conforme a pessoa rola. O gatilho é um link real para a próxima página, então quem não rola também alcança todos os produtos.
Usei o ISR clássico em vez do cache novo do Next 16 para garantir redirects e 404 corretos nas rotas antigas. As consultas ao banco ficam em cache por uma hora.
O compare.mjs pede o mesmo caminho ao site antigo e ao novo e lista as diferenças de status, redirect, title, canonical e H1. Faz 4 requisições por vez, com pausa de 300 ms, para não pesar no servidor de produção.