O Que é Slug de URL (2026): Guia Completo com Boas Práticas e Código
Slug é a parte da URL que identifica a página — e uma das decisões de SEO mais fáceis de acertar e difíceis de desfazer. Este guia cobre o que é, por que importa, regras de criação, normalização de acentos e caracteres especiais, e como gerar slugs em JavaScript, Python e PHP.
Por Vitor Morais
Fundador do MochaLabz ·
Gere slugs em segundos
Digite o título, receba o slug limpo sem acento e pronto pra publicar.
Usar gerador →Slug é a parte final de uma URL que identifica uma página específica, derivada geralmente do título. Na URL https://mochalabz.com/artigos/o-que-e-slug-url, o slug é o-que-e-slug-url. Pode parecer detalhe, mas é uma das decisões mais visíveis de arquitetura de informação de um site. Slug bom é curto, descritivo, separado por hífens, sem acentos e consistente em todo o site.
Este guia cobre o que caracteriza um bom slug, como gerar em diferentes linguagens, como evitar armadilhas de acentuação e caracteres especiais, e o que fazer quando precisar mudar slug já publicado.
Por que slug importa
Slug afeta quatro coisas em ordem de importância:
- Compartilhabilidade: URL legível em WhatsApp, Slack, e-mail gera mais clique.
/guia-de-seovence/?p=4821. - Confiança: usuário sabe para onde clica antes de clicar.
- SEO direto: palavra-chave na URL é um dos sinais de relevância do Google (fraco, mas existe).
- Organização interna: estrutura de URL facilita code review, analytics, debug.
Regras universais de um bom slug
| Critério | Exemplo bom | Exemplo ruim |
|---|---|---|
| Minúsculas | guia-de-seo | Guia-DE-SEO |
| Hífen separa palavras | o-que-e-slug-url | o_que_e_slug_url |
| Sem acentos | sao-paulo | são-paulo |
| Sem caracteres especiais | precificacao | precificação! |
| Palavra-chave principal | guia-prompt-engineering | como-usar |
| Curto e descritivo | ab-test-titulos | teste-a-b-em-titulos-de-blog-para-conversao |
| Sem stop words desnecessárias | guia-seo | o-guia-de-como-fazer-seo |
| Sem números (exceto quando fazem parte do tema) | redirect-301 | artigo-42 |
Atenção
%20 e URL vira feia. Pior: alguns sistemas interpretam espaço como delimitador e quebram a rota.Acentos e caracteres especiais: a dor brasileira
Em português, títulos têm acentos naturais: “São Paulo”, “Pré- Requisitos”, “Café”, “Ação”. Converter pra slug exige normalização.
Tabela de conversão padrão
| Critério | Vira |
|---|---|
| á, à, â, ã, ä | a |
| é, ê, ë | e |
| í, ï | i |
| ó, ô, õ, ö | o |
| ú, ü | u |
| ç | c |
| ñ | n |
| ß | ss |
Caracteres especiais: remover ou substituir?
- Pontos, vírgulas, exclamação: remover.
- E comercial (&): substituir por “e” (“gatos & cachorros” → “gatos-e-cachorros”).
- Porcentagem (%): substituir por “porcento”.
- Barra (/): remover ou substituir por hífen — conflita com hierarquia de rota.
- Aspas e parênteses: remover.
Algoritmo para gerar slug
Qualquer biblioteca de slug segue esses passos:
- Converte para minúsculas.
- Normaliza Unicode para forma decomposta (NFD), separando acento do caractere.
- Remove os caracteres de acento remanescentes (categoria Unicode “Mn”).
- Substitui caracteres não alfanuméricos por hífen.
- Colapsa hífens consecutivos em um só.
- Remove hífens no início e no fim.
Implementação em JavaScript
function slugify(texto) {
return texto
.toLowerCase()
.normalize("NFD") // separa acento do caractere
.replace(/[\u0300-\u036f]/g, "") // remove marcas de acento
.replace(/[^a-z0-9\s-]/g, "") // remove especiais
.trim()
.replace(/\s+/g, "-") // espaços viram hífen
.replace(/-+/g, "-"); // colapsa hífens duplicados
}
slugify("Como Criar Slugs de URL?");
// "como-criar-slugs-de-url"
slugify("Ações da São Paulo & Cia.");
// "acoes-da-sao-paulo-cia"
slugify(" Guia Completo 2026 ");
// "guia-completo-2026"Versão TypeScript mais robusta
export function slugify(
texto: string,
options: { maxLength?: number; stopWords?: string[] } = {},
): string {
const { maxLength = 60, stopWords = ["de", "a", "o", "e"] } = options;
let slug = texto
.toLowerCase()
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
.replace(/[^a-z0-9\s-]/g, "")
.trim()
.split(/\s+/)
.filter((word) => !stopWords.includes(word))
.join("-")
.replace(/-+/g, "-");
if (maxLength && slug.length > maxLength) {
slug = slug.substring(0, maxLength).replace(/-[^-]*$/, "");
}
return slug;
}
slugify("O Guia Completo de SEO para Iniciantes");
// "guia-completo-seo-para-iniciantes"Dica
Bibliotecas populares em JavaScript
| Critério | Tamanho | Suporte Unicode |
|---|---|---|
| slugify | 5 KB | Completo com mapeamentos custom |
| slug | 3 KB | Sim, com transliteração |
| speakingurl | 14 KB | Sim, sobretudo para não-latinas |
| @sindresorhus/slugify | 6 KB | Sim, com locale específico |
import slugify from "slugify";
slugify("Ações da São Paulo", {
lower: true,
strict: true,
locale: "pt",
});
// "acoes-da-sao-paulo"
slugify("João & Maria's Café", {
lower: true,
strict: true,
replacement: "-",
remove: /[*+~.()'"!:@]/g,
});
// "joao-and-maria-s-cafe"Implementação em Python
# Função manual
import re
from unicodedata import normalize
def slugify(texto: str) -> str:
# NFD separa acento; encoding ASCII remove
slug = normalize("NFD", texto).encode("ascii", "ignore").decode()
slug = slug.lower()
slug = re.sub(r"[^a-z0-9\s-]", "", slug)
slug = re.sub(r"\s+", "-", slug.strip())
slug = re.sub(r"-+", "-", slug)
return slug
slugify("Ações da São Paulo & Cia.")
# "acoes-da-sao-paulo-cia"
# Ou usar biblioteca:
# pip install python-slugify
from slugify import slugify as py_slugify
py_slugify("Ações da São Paulo & Cia.", separator="-")
# "acoes-da-sao-paulo-and-cia"Implementação em PHP
function slugify(string $texto): string {
$slug = iconv("UTF-8", "ASCII//TRANSLIT", $texto);
$slug = strtolower($slug);
$slug = preg_replace("/[^a-z0-9\s-]/", "", $slug);
$slug = preg_replace("/\s+/", "-", trim($slug));
$slug = preg_replace("/-+/", "-", $slug);
return $slug;
}
slugify("Ações da São Paulo & Cia.");
// "acoes-da-sao-paulo-cia"Uso em CMS e frameworks
WordPress
WordPress gera slug automaticamente do título ao salvar. Campo editável abaixo do título no editor. Usa a função sanitize_title() internamente — boa por padrão, mas ignora stop words em PT-BR. Para controle avançado, use plugin Yoast ou Rank Math que oferece sugestões baseadas em keyword principal.
Next.js App Router
// app/blog/[slug]/page.tsx
interface PageProps {
params: Promise<{ slug: string }>;
}
export async function generateStaticParams() {
const posts = await getPosts();
return posts.map((post) => ({
slug: slugify(post.title),
}));
}
export default async function BlogPost({ params }: PageProps) {
const { slug } = await params;
const post = await getPostBySlug(slug);
// ...
}Django
Django tem SlugField nativo e função django.utils.text.slugify()que já cobre Unicode, acentos e normalização. Padrão da indústria.
Slug único: evitando colisões
Dois posts com títulos iguais ou muito parecidos geram mesmo slug. Estratégias:
- Adicionar contador:
meu-titulo,meu-titulo-2,meu-titulo-3. - Adicionar ID:
meu-titulo-a1b2c3(menos legível, mas único). - Adicionar ano:
guia-seo-2025,guia-seo-2026. - Diferenciar no editor: humano escolhe slug único manualmente.
async function generateUniqueSlug(titulo: string): Promise<string> {
const baseSlug = slugify(titulo);
let slug = baseSlug;
let counter = 2;
while (await postExists(slug)) {
slug = `${baseSlug}-${counter}`;
counter++;
}
return slug;
}Mudando slug: a regra do 301
Se você mudar slug de /guia-seo para /guia-seo-iniciantes, precisa configurar redirect 301 da URL antiga para a nova. Sem isso:
- Todo link externo aponta para 404.
- Autoridade SEO acumulada vira zero.
- Ranqueamento cai.
- Usuários perdem histórico de bookmarks.
Configuração em Next.js:
// next.config.js
module.exports = {
async redirects() {
return [
{
source: "/guia-seo",
destination: "/guia-seo-iniciantes",
permanent: true, // 301
},
];
},
};Vai mais fundo
Estruturas de URL flat vs hierárquica
| Critério | Exemplo | Quando usar |
|---|---|---|
| Flat | /guia-seo | Blogs simples, sites pequenos |
| Hierárquica 1 nível | /blog/guia-seo | Blog + outras seções (docs, loja) |
| Hierárquica 2 níveis | /blog/seo/guia | E-commerce, portais grandes |
| Com data (NYT style) | /2026/04/guia-seo | News sites, blogs onde data importa |
Caracteres a evitar a qualquer custo
- Espaços: codificados como
%20, feios. - Underscores: Google trata como parte da palavra.
- Maiúsculas: URLs são case-sensitive em Linux; risco de duplicação (Artigo vs artigo).
- Acentos: codificação feia, incompatibilidades.
- Pontuação: pontos, vírgulas, aspas — remover tudo.
- Múltiplos hífens seguidos: sinal de processo de slug ruim.
- Tamanho excessivo: mais de 5 palavras raramente agrega valor.
Erros clássicos
- Usar ID em vez de slug:
/post/4821é feio e inútil para SEO. - Slug igual ao title inteiro: 80 caracteres é demais. Resuma nas 3–5 palavras-chave.
- Gerar slug no frontend sem validação no backend: usuário mal- intencionado envia slug inválido.
- Não testar Unicode exótico: emojis e caracteres chineses/japoneses podem quebrar slugify mal feito.
- Mudar slug sem redirect: mata SEO acumulado.
- Slug case-sensitive em produção: a mesma URL em minúscula e maiúscula retorna páginas diferentes ou 404.
Slug e versões em idioma
Em sites multi-idioma, cada versão precisa de slug próprio. Exemplo:
PT: /pt-br/guia-seo-iniciantes
EN: /en/seo-beginners-guide
ES: /es/guia-seo-principiantes
<link rel="alternate" hreflang="pt-BR" href=".../pt-br/guia-seo-iniciantes">
<link rel="alternate" hreflang="en" href=".../en/seo-beginners-guide">
<link rel="alternate" hreflang="es" href=".../es/guia-seo-principiantes">Slug em uma frase
Slug é decisão pequena com consequência grande: afeta SEO, compartilhabilidade e confiança do usuário, e é dolorosa de mudar depois de publicar. Escrever 5 minutos de slug bom uma vez economiza horas de redirect e ranqueamento perdido depois. É um dos investimentos de menor esforço e maior retorno em SEO on-page.
Perguntas frequentes
O que é exatamente um slug de URL?+
Slug é a parte final da URL que identifica uma página específica, normalmente após a última barra. Em https://seusite.com/blog/guia-de-seo, o slug é 'guia-de-seo'. É uma versão legível, amigável ao usuário e otimizada para SEO, criada a partir do título da página. Slug bom é curto, descritivo, com hífens separando palavras e sem caracteres especiais ou acentos.
Slug influencia ranqueamento no Google?+
Influencia, mas o peso é moderado. O Google lê palavras da URL como um dos sinais de relevância. Slug com palavra-chave principal ajuda, especialmente em queries específicas. Estudos mostram ~3% de impacto no CTR (usuário confia mais em URL descritiva). O grande benefício é compartilhabilidade: URL legível é mais clicada em WhatsApp, Slack e e-mail.
Devo usar hífen ou underscore no slug?+
Hífen. O Google trata hífen como separador de palavras (guia-de-seo vira três palavras); underscore é tratado como caractere único (guia_de_seo vira uma palavra só). Essa é a única regra absoluta do SEO sobre slugs — válida desde 2005 e confirmada por Matt Cutts, John Mueller e qualquer guia oficial do Google. Use hífen, sempre.
Posso usar acentos e caracteres especiais no slug?+
Tecnicamente, sim — URLs aceitam UTF-8 desde RFC 3987. Na prática, não. Acentos geram URL-encoding feio no clipboard (guia-de-são-paulo vira guia-de-s%C3%A3o-paulo), quebram em alguns sistemas antigos e prejudicam compartilhamento. A convenção em PT-BR é: remova acentos, troque por letras ASCII equivalentes (são → sao, café → cafe).
Qual o tamanho ideal de um slug?+
Entre 3 e 60 caracteres. Até 5 palavras separadas por hífen é o sweet spot para SEO e legibilidade. Slugs muito curtos (1-2 palavras) deixam espaço na margem e são difíceis de diferenciar em URLs similares. Muito longos ficam feios em compartilhamento e podem ser truncados pelo Google em alguns contextos. Se o título tem 10 palavras, priorize as 3-5 principais no slug.
Posso mudar o slug de uma página depois que ela foi publicada?+
Pode, mas configure redirect 301 da URL antiga para a nova. Sem isso, você perde todo o SEO acumulado e deixa links quebrados em quem compartilhou. Em WordPress, plugins como Redirection automatizam. Em Next.js, configure em next.config.js. Em Nginx/Apache, rule de rewrite. Nunca simplesmente deletar a URL antiga — é trair quem te linkou.
Devo incluir ano ou categoria no slug?+
Em geral, não. /2026/04/guia-de-seo ou /seo/artigos/guia-de-seo são padrões antigos que hoje são considerados ruins para SEO: dificultam atualização (o ano fica preso) e adicionam ruído à URL. Prefira slug flat: /guia-de-seo. Exceção: news sites onde data é parte da informação (G1, NYT). Para blogs evergreen, flat vence.
Qual a diferença entre slug e permalink?+
Permalink é a URL completa e permanente de uma página. Slug é só a parte identificadora dentro do permalink. Em https://meublog.com/guia-seo, o permalink é a URL inteira e o slug é 'guia-seo'. WordPress tradicionalmente chama a parte editável de “permalink” na interface, mas tecnicamente está se referindo ao slug. Os termos se sobrepõem na prática.
Artigos relacionados
Title Tag SEO (2026): O Que É, Como Escrever e Aumentar CTR no Google
Guia completo da title tag: anatomia, tamanho ideal, fórmulas que aumentam CTR, por que o Google reescreve títulos e implementação em WordPress, Next.js e e-commerce.
URL Amigável para SEO: Como Criar Slugs que Ranqueiam (Guia 2026)
Guia completo de URLs amigáveis: estrutura ideal, slug, hífen vs underscore, tamanho, posicionamento da keyword, hierarquia flat vs nested, padrões para multi-idioma, geração programática e os 10 erros que matam SEO.
Redirect 301 vs 302 vs 307 vs 308 para SEO: Guia Completo (2026)
Quando usar cada tipo de redirect HTTP, como afeta SEO e link equity, implementação em Next.js, Apache, Nginx, Vercel e Cloudflare, mapeamento em massa para migrações e auditoria de chains/loops.