# URL length and structure: what actually matters

> URLs are a minor ranking signal and a major usability one. The rules that hold up for length, words, folders and parameters, when to change an existing URL, and which permalink setting to pick.

Updated 2026-09-25 · Technical SEO · HTML version: https://getreport.app/guides/url-length-and-structure-what-matters

A URL is read by three audiences: the person deciding whether to click a search result or a shared link, the browser and every tool that has to encode it, and the search engine that uses it as the page's identity. The first audience decides most of what matters. This guide lists the rules that hold up, the ones that are folklore, what to do with parameters, and when it is worth changing an address that already exists. Ten minutes to read, and most sites need to change nothing except how new pages are named.

## Quick answer

- Words, not IDs: `/leather-bag-care/` beats `/?p=4182` and `/product/4182/`.
- Lowercase, hyphens between words, no spaces, no underscores, no file extensions you do not need.
- Short enough to read in one glance: the report warns above 100 characters; under about 75 keeps the whole address visible when shared.
- Folders that mean something to the visitor (`/guides/`, `/shop/bags/`), not folders that mirror the CMS or the year.
- No session IDs, tracking parameters or sort orders in the address you canonicalise, link to or put in the sitemap.
- Leave existing URLs alone unless the change fixes a real problem, and then redirect every old address with a 301.

## Why URL structure matters

Google's own guidance is modest: keep URLs simple, readable and consistent, use hyphens, avoid parameters where you can. Words in the URL are a small signal, far behind the title, the content and the links pointing at the page. Nobody outranks a competitor by renaming `/services/` to `/best-plumbing-services-london/`.

What the URL does decide is whether people click and whether they can pass it on. In a search result the address shows under the title, often as a breadcrumb; in a chat message, an email or a printed flyer it is the whole thing. `example.com/returns/` tells the reader what they will get. `example.com/index.php?id=88&cat=3&lang=en` tells them nothing and looks like something they should not click. Readable URLs are also easier to type after hearing them, easier to recognise in analytics, and easier to migrate to another system later without a spreadsheet of numeric IDs.

The other thing that matters is stability. Every URL you publish collects links, bookmarks and a place in Google's index. Change it without a redirect and all of that points at a 404. The best URL structure is one you will not need to change, which is why the choice deserves ten minutes before the first page goes live and almost no time after.

Length matters at the margins. Browsers and servers accept thousands of characters, but the sitemap protocol caps each `<loc>` at 2,048, some email clients break long addresses across lines, and a 180-character URL pasted into a message is usually cut off or wrapped so the link stops working. Long URLs are nearly always a symptom of something else: parameters, dates, a slug copied from a whole headline, or a folder chain that mirrors a category tree.

## How getReport checks it

> **Free tool:** [Free SEO audit](https://getreport.app/tools/seo-audit): Every on-page and technical SEO check in one run: title and description, headings, canonical, robots and sitemaps, indexability, links, images and mobile readiness — each with a fix.

The audit works from the **final URL**, after following redirects: it counts the characters of the whole address, scheme and host included, and warns above 100. That number is deliberately generous. A URL that fails it has parameters or a headline-length slug, not a merely long word.

> **Check: URL length.** Long URLs are cut off in search results and hard to share by hand. Short, readable URLs get more clicks and fewer typos.
>
> 1. Shorten the slug to 3–5 meaningful words and drop tracking or session parameters from the canonical URL.

The audit also reads every same-host link on the page for two structure problems. It sorts directory-style links (paths without a file extension) into "ends with a slash" and "does not", and warns when a page mixes the two styles, listing examples. On a WordPress site, it looks for links using `?p=`, `?page_id=`, `?cat=` or `?attachment_id=` and warns when it finds two or more, because those are the plain permalink structure leaking into menus and content.

> **Check: Internal links use trailing slashes consistently.** /shop/ and /shop are two different URLs to a search engine. Linking to both styles creates duplicate pages and splits their signals.
>
> 1. Choose one style (with or without trailing slash) and redirect the other to it with a 301.
> 2. Update internal links and the sitemap to use the chosen style everywhere.

> **Check: Permalinks use readable slugs.** Addresses like ?p=123 carry no keywords, look untrustworthy in search results and break when content is migrated. Every other permalink setting is better.
>
> 1. Go to Settings → Permalinks and choose "Post name". WordPress redirects the old ?p= addresses automatically.
> 2. Update any hard-coded links in menus and widgets afterwards.

![The SEO audit panel of the example shop with the URL findings: the URL length passing with its character count, the trailing slash finding listing links in both styles, and the canonical finding above them](https://getreport.app/guides/img/url-length-and-structure-what-matters/seo-panel.webp "The audit shows the URL length next to the slash and canonical findings; all three describe the same address.")

The audit checks one page at a time. Run it on a product, a category and a blog post, because each template names URLs differently, and the problems are per template, not per page.

## Step by step

### 1. Name pages with words the visitor would use

The slug is the last part of the path, and it is the part the visitor reads. Three to five words that say what the page is about: `/returns/`, `/leather-bag-care/`, `/shop/bags/weekender-tan/`. Not the whole headline (`/10-things-you-need-to-know-about-caring-for-leather-bags-in-2026/`), not a code (`/p4182/`), not a category repeated (`/bags/bags-weekender/`).

Stop words (`a`, `the`, `of`, `in`) are fine when they make the slug read naturally and harmless when removed; do not agonise over them. Numbers are fine when they are part of the name (`/iphone-15-case/`); dates are only useful for news and event pages where the date is part of what the reader wants.

### 2. Lowercase, hyphens, ASCII where it is natural

Paths are case-sensitive on most servers, so `/Returns/` and `/returns/` can be two pages, and the visitor who types the wrong one gets a 404. Generate everything lowercase and, if the server allows it, redirect uppercase requests to lowercase.

Use hyphens between words. Google reads `leather-bag-care` as three words and `leather_bag_care` as one; that is the whole difference, and it is the one rule in this guide that comes straight from Google's documentation on [URL structure](https://developers.google.com/search/docs/crawling-indexing/url-structure). Spaces become `%20` in links and look broken.

Non-ASCII characters are allowed and correct for sites in languages that need them: `/über-uns/`, `/カバン/`, an internationalised domain name. Browsers display them as typed and encode them on the wire (`/%C3%BCber-uns/`), and Google indexes both forms as one. The only cost is that an encoded URL is long and ugly when copied from some tools, so a site that serves several languages sometimes prefers ASCII slugs for sharing. Either choice is fine; mixing both for the same page is not.

### 3. Folders should mean something to the reader

`/shop/bags/weekender-tan/` tells a visitor where they are and gives you a `/shop/bags/` page to link to. `/2026/09/25/weekender-tan/` tells them when the page was created, which for a product is noise. `/index.php/shop/bags/` or `/wp/shop/` exposes the software. `/content/en-gb/products/category-bags/item-weekender-tan/` mirrors the CMS tree and doubles the length.

Two levels is a comfortable maximum for most sites; three when the site is big enough to need it. Every level should be a page someone might visit. If `/shop/bags/` would be an empty folder, do not put it in the path.

Do not confuse depth in the URL with depth in the site. Google measures how far a page is from the home page in clicks, not in slashes. A page at `/weekender-tan/` that no page links to is an orphan; a page at `/shop/bags/weekender-tan/` linked from the menu is two clicks away. Internal links, not folders, decide that.

### 4. Keep parameters out of the address you canonicalise

Filters, sort orders, pagination and tracking codes all add `?key=value` to the path, and each combination is technically a separate URL. `?utm_source=newsletter`, `?sort=price&order=asc`, `?sessionid=8f2a…` can turn one category into thousands of addresses that Google crawls and mostly discards.

The rules that keep this under control:

- The **canonical tag** on every parameter variant points at the clean URL. Sorting and tracking parameters never change the canonical; a filter that produces a genuinely different set of products (a colour, a size) can be its own indexable page if it deserves one, with its own canonical.
- Internal links, menus and the sitemap use clean URLs only.
- Session IDs never go in URLs at all; cookies exist for that.
- Pagination (`?page=2` or `/page/2/`) is fine and should stay crawlable; do not canonicalise page 2 to page 1.

The canonical is what makes the mess harmless: [canonical tags explained](https://getreport.app/guides/canonical-tags-explained) covers how to write and verify it.

### 5. Change existing URLs only for a reason, and always with 301s

Good reasons: the site uses `?p=123` addresses; the slug contains a typo or an outdated product name; the structure includes dates on evergreen pages; a domain or CMS migration forces it anyway. Bad reasons: adding a keyword, making it shorter for tidiness, matching a competitor.

When you do change one, the redirect is the job, not the rename:

```apache
# .htaccess at the site root, one line per moved page
Redirect 301 /2019/04/leather-bag-care-tips/ /leather-bag-care/
```

```nginx
# nginx server block: whole date-based structure to slug-only, one hop
location ~ "^/\d{4}/\d{2}/(?:\d{2}/)?(?<slug>[^/]+)/?$" {
    return 301 /$slug/;
}
```

The nginx pattern redirects every date-prefixed post to `/slug/` in one rule, which is what a WordPress site does when moving from "Day and name" to "Post name"; test it on ten old addresses before relying on it. Pages that had no links and no traffic can be left to 404 instead; a redirect for every URL that ever existed is not required.

After the change, update internal links to the new address so they do not run through the redirect. The report's "links go through a redirect" finding on the broken link checker lists them per page.

### 6. Trailing slash: one style, everywhere

`/shop` and `/shop/` are different URLs to a search engine. Your CMS picks one and redirects the other; the mistake is linking to both. The audit's slash finding shows which links go the wrong way. Choosing and enforcing a style, together with `www` and `https`, is its own short job: [trailing slashes, www and https](https://getreport.app/guides/trailing-slashes-www-and-https-pick-one).

## Platform notes

### WordPress

Settings → Permalinks offers six structures; two are worth using:

| Setting | Example | Use it for |
| --- | --- | --- |
| Plain | `/?p=123` | Nothing; WordPress redirects the old `?p=` links itself once you switch |
| Day and name | `/2026/09/25/leather-bag-care/` | Daily news sites only |
| Month and name | `/2026/09/leather-bag-care/` | Frequent publishers who want dated archives |
| Numeric | `/archives/123` | Nothing |
| Post name | `/leather-bag-care/` | Almost every site |
| Custom | `/%category%/%postname%/` | Sites where the category is a real section; a post can then only ever be in one category, and renaming a category moves every post |

WordPress builds the slug from the title and keeps it when you edit the title later, which is right: change the title freely, change the slug only with a redirect. The slug field is under the title in the editor (Permalink → URL). Category and tag bases (`/category/bags/`) can be shortened in the same settings screen; removing the base entirely needs a plugin and is not worth the trouble. [WordPress permalinks](https://getreport.app/guides/wordpress-permalinks) walks through changing the structure on a live site.

### Shopify

The structure is fixed: `/products/handle`, `/collections/handle`, `/pages/handle`, `/blogs/news/handle`. You control the handle, which is the slug. Changing a handle offers a "create a URL redirect" checkbox; tick it. Collection-scoped product URLs (`/collections/bags/products/weekender-tan`) carry a canonical to the plain product URL, so link to the plain one from your own content.

### Static sites / custom

The file path is the URL, so the rules apply to how you name files and folders: `content/guides/url-structure.md` becomes `/guides/url-structure/`. Frameworks that generate `.html` extensions (`/about.html`) can usually be configured to serve clean paths instead; pick one before launch, because switching later is a redirect job. Redirects go in the host's config (`_redirects` on Netlify, `redirects` in `vercel.json`).

## Verify

- The URL length finding passes on a product, a category and a post, with the count shown; anything close to 100 characters usually has a parameter to remove.
- The trailing slash finding reads "Internal links use trailing slashes consistently" and, on WordPress, the permalink finding reads "Permalinks use readable slugs".
- The canonical of a filtered or tracked URL (`/shop/bags/?sort=price`) points at the clean address: view the source and look for `rel="canonical"`.
- Every old address you changed answers 301 once and lands on the new one: `curl -sI https://example.com/2019/04/leather-bag-care-tips/ | grep -i -E "^(HTTP|location)"`.

## Common mistakes

- **Renaming for keywords.** Symptom: rankings dip after a "URL optimisation" that changed hundreds of slugs. The gain from keywords in the URL is tiny and the loss from broken links and a recrawl is real. Leave working URLs alone.
- **Whole headlines as slugs.** `/why-your-leather-bag-cracks-and-the-7-ways-to-stop-it/` is 55 characters of slug that nobody can retype. Edit the slug to `/leather-bag-cracking/` before publishing; after publishing, only with a redirect.
- **Category in the path on WordPress.** `/%category%/%postname%/` looks structured until a post is filed under two categories or a category is renamed; every affected URL then changes. Use "Post name" and let categories be archive pages.
- **Tracking parameters in internal links.** Linking to `/shop/?utm_source=homepage` from your own home page creates duplicate URLs and breaks the analytics attribution it was meant to improve. Use plain links internally; UTM is for links from other places.
- **Uppercase and encoded characters mixed.** `/Shop/Bags/` linked from one template and `/shop/bags/` from another are two URLs with a redirect, or a 404, between them. Generate lowercase everywhere and add a lowercase redirect for the addresses already out there.
