1️⃣ Technical Requirements #
- Follow IETF STD 66
- Percent encode reserved characters (%20 for space, %3F for ?)
- Ensures Google can correctly read the URL
- Percent encode reserved characters (%20 for space, %3F for ?)
- Avoid Fragments (#) for Content Changes
- ❌ https://example.com/#/potatoes
- ✅ Use History API for JavaScript changes
- Google ignores most # fragments in crawling
- ❌ https://example.com/#/potatoes
- Standard Parameter Encoding
- ✅ ?category=dresses&sort=low-to-high
- ❌ ?[category:dresses][sort:lowtohigh]
- Keeps parameters crawler-friendly
- ✅ ?category=dresses&sort=low-to-high
2️⃣ Structure & Readability #
- Use Descriptive Words in URLs
- ✅ https://example.com/wiki/aviation
- ❌ https://example.com/index.php?id=12345
- ✅ https://example.com/wiki/aviation
- Use Audience’s Language
- ✅ German site: https://example.com/lebensmittel/pfefferminz
- ✅ Japanese site: https://example.com/ペパーミント
- Matches search intent and improves local SEO
- ✅ German site: https://example.com/lebensmittel/pfefferminz
- Use UTF-8 Encoding for Special Characters
- ✅ Encoded: https://example.com/%E6%9D%82%E8%B4%A7
- ❌ Raw: https://example.com/杂货
- ✅ Encoded: https://example.com/%E6%9D%82%E8%B4%A7
- Use Hyphens (-) Instead of Underscores (_)
- ✅ https://example.com/summer-clothing
- ❌ https://example.com/summer_clothing
- ✅ https://example.com/summer-clothing
3️⃣ Optimization & Consistency #
- Minimize Parameters
- Remove unnecessary query strings
- Shorter URLs rank better and are easier to share
- Remove unnecessary query strings
- Maintain Consistent Case
- ✅ Lowercase: /apple
- ❌ Mixed Case: /Apple and /apple (Google treats them as different pages)
- ✅ Lowercase: /apple
- Structure for Multi-Regional Sites
- ✅ Country domains: https://example.de
- ✅ Subdirectories: https://example.com/de/
- ✅ Country domains: https://example.de
| Requirement | Best Practice (Recommended) | Bad Practice (Not Recommended) |
| Follow IETF STD 66 | Use percent encoding for reserved characters ✅ Example: /my%20page for space | ❌ Using unencoded reserved characters may cause crawling issues |
| Avoid URL Fragments (#) | Use History API for dynamic content changes ✅ https://example.com/potatoes | ❌https://example.com/#/potatoes (Google ignores fragments for crawling) |
| Parameter Encoding | Use = to separate key-value pairs and & for additional parameters ✅ https://example.com/category?category=dresses&sort=low-to-high&sid=789 | ❌ Using : or [] for parameters ❌https://example.com/category?[category:dresses][sort:price-low-to-high] |
| Multiple Values for Same Key | Use commas within a parameter value ✅ https://example.com/category?category=dresses&color=purple,pink,salmon&sort=low-to-high&sid=789 | ❌ Using commas and double commas for separating parameters ❌https://example.com/category?category,dresses,,sort,lowtohigh,,sid,789 |
Make it easy to understand your URL structure #
To help Google Search (and your users) better understand your site, we recommend creating a simple URL structure, applying the following best practices when possible.
| Best Practice | Recommended | Not Recommended |
| Use descriptive URLs | https://example.com/wiki/Aviation | https://example.com/index.php?topic=42&area=3a5ebc944f41daa6f849f730f1 |
| Use audience’s language | https://example.com/lebensmittel/pfefferminz (German) https://example.com/ペパーミント (Japanese) | Using unrelated or non-localized terms in URLs |
| Use UTF-8 encoding for non-ASCII characters | https://example.com/%D9%86%D8%B9%D9%86%D8%A7%D8%B9/%D8%A8%D9%82%D8%A7%D9%84%D8%A9 https://example.com/%E6%9D%82%E8%B4%A7/%E8%96%84%E8%8D%B7 https://example.com/gem%C3%BCse | https://example.com/نعناع https://example.com/杂货/薄荷 https://example.com/gemüse |
| Use hyphens to separate words | https://example.com/summer-clothing/filter?color-profile=dark-grey | https://example.com/summer_clothing/filter?color_profile=dark_grey https://example.com/greendress |
| Minimize unnecessary parameters | Keep URLs clean, only required parameters | URLs with excessive or irrelevant parameters |
| Consistent case usage | Convert all URLs to lowercase /apple consistently | /APPLE vs /apple treated as different URLs |
| Multi-regional targeting | https://example.de (Country-specific domain) https://example.com/de/ (Subdirectory for locale) | Mixing locales without clear URL structure |
Avoid Common Issues Related to URLs #
Complex URLs with multiple parameters can confuse search engines and waste crawl budget. When too many URL variations point to the same or similar content, Googlebot may spend excessive bandwidth crawling duplicates instead of discovering fresh pages. This can lead to slower indexing and incomplete coverage of your site in Google Search.
👉 Keep URLs clean, consistent, and minimal in parameters to ensure efficient crawling and full indexation of important pages.
| Common Issue | Description | Example URLs | Recommended Fix / Note |
| Additive Filtering | Combining multiple filters creates many URL variations showing similar content, causing URL explosion and redundant crawling. Google only needs a few representative pages to find the individual items. | – https://example.com/hotel-search-results.jsp?Ne=292&N=461- https://example.com/hotel-search-results.jsp?Ne=292&N=461+4294967240- https://example.com/hotel-search-results.jsp?Ne=292&N=461+4294967240+4294967270 | Limit crawlable filtered URLs; use canonical tags or block crawling of parameter combinations. |
| Irrelevant Parameters | URLs with unnecessary parameters like referral IDs, sorting, or session IDs create many duplicate URLs that do not change main content. | – https://example.com/search/noheaders?click=6EE2BF1AF6A3D705D5561B7C3564D9C2&clickPage=OPD+Product+Page&cat=79- https://example.com/discuss/showthread.php?referrerid=249406&threadid=535913- https://example.com/results?search_sort=relevance- https://example.com/search/noheaders?sessionid=6EE2BF1AF6A3D705D5561B7C3564D9C2 | Avoid session IDs in URLs (use cookies). Block or disallow crawling via robots.txt of such URLs. |
| Calendar Issues | Dynamically generated calendar pages create infinite URLs for past/future dates, wasting crawl budget and causing duplicate content. | – https://example.com/calendar.php?d=13&m=8&y=2011 | Use nofollow on links to dynamic future dates or restrict calendar crawling. |
| Broken Relative Links | Incorrect use of parent-relative links on wrong pages can create infinite or broken URLs if server doesn’t properly respond with 404. | – Link: <a href=”../../category/stuff”> on https://example.com/category/community/070413/html/FAQ.htm- Leads to bogus URLs like https://example.com/category/community/category/stuff | Use root-relative URLs instead of parent-relative URLs to avoid incorrect paths. |
Fixing crawling-related URL structure problems #
| Issue | Recommended Fix | Details |
| Problematic dynamic URLs | Use robots.txt to block Googlebot access | Block URLs that generate search results or have dynamic parameters that cause excessive crawling |
| Infinite URL spaces (e.g., calendars) | Use robots.txt or nofollow attributes on problematic links | Prevent crawling of infinite date ranges or dynamically created pages |
| Faceted navigation URLs | Manage crawling carefully | Implement best practices for faceted navigation to avoid crawling duplicate or nearly identical filtered URLs |