How to Generate SEO-Friendly URL Slugs
Learn how to create clean, SEO-friendly URL slugs from any text. Strip special characters, handle spaces, remove stop words, and keep URLs readable and short.
What a Slug Is
A URL slug is the last segment of a URL path that identifies a specific page in human-readable form:
https://example.com/blog/how-to-bake-bread
└────── slug ──────┘
A good slug tells both search engines and humans what the page is about before they click. It's not just an ID or a hash. It carries semantic weight.
Compare these two URLs for the same article about bread baking:
https://example.com/blog/how-to-bake-breadhttps://example.com/blog?id=1849&cat=recipes
The first one tells you everything. The second one tells you nothing. Even before the page loads, you know what you're going to get from the first URL. That's the power of a well-crafted slug.
The Rules for a Good Slug
Lowercase Only
URL paths are case-sensitive on some servers (Apache on Linux) and
case-insensitive on others (IIS on Windows). Lowercase everywhere avoids
duplicate content issues where /Blog and /blog point to different pages.
Google sees /Blog and /blog as two different URLs. If both exist and return
the same content, you have a duplicate content problem. Search rankings get
split between two competing URLs. Canonical tags can fix this, but consistent
lowercase prevents it from happening at all.
Hyphens, Not Underscores
Google treats hyphens as word separators and underscores as word joiners.
how-to-bake-bread is read as "how to bake bread". how_to_bake_bread is read
as "howtobakebread", a single compound word. Use hyphens.
This isn't speculation. Matt Cutts, former head of Google's webspam team,
confirmed it publicly. The Googlebot tokenizer treats underscores as joiners.
Your python_lists_vs_tuples becomes pythonlistsvstuples in Google's index.
The search engine cannot extract keywords from it.
Remove Stop Words
Words like "a", "an", "the", "and", "or", "but", "in", "on", "of", "to" add
length without adding meaning. A title like "How to Bake the Perfect Loaf of
Bread" becomes how-bake-perfect-loaf-bread not
how-to-bake-the-perfect-loaf-of-bread. Shorter slugs rank better and are
easier to share.
However, don't remove "how to" from how-to guides. That phrase signals search
intent. A slug like bake-perfect-loaf-bread loses the "how to" signal that
matches informational queries.
Strip Special Characters
Accented characters, symbols, and punctuation must be removed or transliterated.
café becomes cafe. résumé becomes resume. what's new? becomes
whats-new.
Some languages use characters that have no direct ASCII equivalent. The German
ß (eszett) is typically transliterated to ss. The Icelandic ð becomes
d. Japanese, Chinese, and Cyrillic characters require full transliteration to
Latin script, which is a harder problem. Most slug generators handle Latin
accented characters well but struggle with non-Latin scripts.
Limit Length
Slugs over 60 characters tend to get truncated in search results. Keep slugs under 60 characters. If the title is long, preserve the most important words and drop the rest.
Long slug: how-to-build-a-production-grade-rest-api-with-node-js-and-express-in-2026
Short slug: build-rest-api-node-express
The short version carries the same keywords. Google can still match it to the query. And the URL fits in a tweet without taking over the entire card.
What a Slug Generator Does
A slug generator takes any input string and produces a clean slug:
Input: "10 Tips for Writing Better Python (in 2026)"
Output: "10-tips-writing-better-python-2026"
Step by step:
- Lowercase the entire string
- Replace accented characters with ASCII equivalents
- Remove punctuation and symbols (keep hyphens)
- Replace spaces with hyphens
- Collapse consecutive hyphens into one
- Strip leading and trailing hyphens
The result is a URL-safe, readable, keyword-containing slug.
Generating Slugs in Code
If you're building a CMS or blog engine, you can generate slugs programmatically instead of relying on a browser tool:
// JavaScript
function slugify(text) {
return text
.toString()
.toLowerCase()
.trim()
.replace(/\s+/g, "-")
.replace(/[^\w-]+/g, "")
.replace(/--+/g, "-")
.replace(/^-+/, "")
.replace(/-+$/, "");
}
# Python
import re
import unicodedata
def slugify(text):
text = unicodedata.normalize("NFKD", text)
text = text.encode("ascii", "ignore").decode("ascii")
text = re.sub(r"[^\w\s-]", "", text).strip().lower()
return re.sub(r"[-\s]+", "-", text)
Both functions handle the core slug generation pipeline. The Python version adds Unicode normalization for accented characters.
Slugs and SEO
The slug is a ranking signal, but a modest one. Google looks at the words in
your URL to understand page relevance. A slug like /blog/42 tells Google
nothing. A slug like /blog/how-to-bake-bread reinforces the page's topic.
More importantly, a clean slug improves click-through in search results. Users
scan the green URL line in SERPs. They're more likely to click
example.com/blog/python-list-comprehensions than
example.com/blog?id=1849&cat=python.
When someone shares your URL in Slack, Discord, or a text message, the slug acts as the title before the link preview loads. A good slug sells the content.
Try it yourself: open the Slug Generator. Type "How to Build a REST API with Node.js and Express (2026 Guide)" and see the generated slug. Notice how stop words are stripped, the year is preserved, and special characters are removed. Try it with accented characters like "café crème brûlée" to see the transliteration.