# Lexikon Umlaut → ASCII Redirects

**Last Updated:** 2026-03-17

Lexikon blog slugs use ASCII-only (ue, ae, oe, ss) for canonical URLs. URLs with German umlauts (ü, ä, ö) or eszett (ß) redirect 301 to the ASCII canonical.

## Why ASCII Slugs

- Avoids encoding issues across browsers, proxies, and CDNs
- Consistent linking and sitemaps
- Simpler analytics and tracking

## Canonical Mapping

| Umlaut | ASCII |
|--------|-------|
| ü | ue |
| ä | ae |
| ö | oe |
| ß | ss |

Example: `Führungskräfteentwicklung` → `fuehrungskraefteentwicklung`

## Adding a New Redirect

When creating a lexikon post with German characters in the title:

1. **Use ASCII slug** for the post (e.g. `fuehrungskraefteentwicklung`)
   - Scaffold: `--topic="Fuehrungskraefteentwicklung" --title="Führungskräfteentwicklung"`

2. **Add to config:** `v2/config/blog-umlaut-redirects.php`
   ```php
   'führungskräfteentwicklung' => 'fuehrungskraefteentwicklung',
   ```

3. **Add .htaccess rule** (percent-encoded path):
   ```
   RewriteRule ^insights/lexikon/f%C3%BChrungskr%C3%A4fteentwicklung/?$ /insights/lexikon/fuehrungskraefteentwicklung/ [R=301,L,QSA]
   ```
   - Encode: ü = %C3%BC, ä = %C3%A4, ö = %C3%B6, ß = %C3%9F

4. **router.php** – No change needed; it reads from the config.

5. **post.php** – No change needed; it reads from the config as fallback.

## Current Redirects

| Umlaut slug | ASCII canonical |
|-------------|-----------------|
| arbeitnehmerüberlassung | arbeitnehmerueberlassung |
| führungskräfteentwicklung | fuehrungskraefteentwicklung |
| führungsstile | fuehrungsstile |
| arbeitsproduktivität | arbeitsproduktivitaet |
| arbeitsproduktivitat | arbeitsproduktivitaet (typo) |
| lohnpfändung | lohnpfaendung |
| personalführung | personalfuehrung |
| mitarbeiterführung | mitarbeiterfuehrung |
| spätschicht | spaetschicht |
| kapazitätsplanung | kapazitaetsplanung |
| gefährdungsbeurteilung | gefaehrdungsbeurteilung |
| höchstarbeitszeit | hoechstarbeitszeit |

## Testing

- **Apache/Docker:** `curl -I "http://localhost:8003/insights/lexikon/f%C3%BChrungskr%C3%A4fteentwicklung/"`
- **PHP built-in:** `php -S localhost:8003 router.php` then visit the URL
- Expected: `301` → `/insights/lexikon/fuehrungskraefteentwicklung/`

## seo-meta.json Keys

seo-meta.json keys must use **ASCII slugs** (e.g. `lexikon/verdachtskuendigung`), matching the post file slug. Umlaut keys (e.g. `lexikon/verdachtskündigung`) cause `sync-meta-to-posts.php` and `load_seo_meta()` to fail, because post files use ASCII filenames and the lookup key is built from the post slug.

## SEO Keyword vs Slug

| Purpose | Form | Example |
|---------|------|---------|
| **URL / slug** | ASCII | `fuehrungsstile` |
| **Primary keyword for SISTRIX/Serper/PAA** | Umlaut | `führungsstile` |

Slug stays ASCII for URLs. For SEO research (SISTRIX, Serper, PAA, SERP), use the umlaut form—it returns accurate search volume and SERP data. See [PRIMARY_KEYWORD_MANAGEMENT_GUIDE.md](../../content/blog/PRIMARY_KEYWORD_MANAGEMENT_GUIDE.md).

## Internal Linking: Umlaut + ASCII Matching

Internal linking scripts match **both** umlaut and ASCII forms in content:

- **getKeywordMatchVariants()** (`v2/config/blog-keyword-helpers.php`) returns both forms for a keyword
- **contentContainsKeywordWithBoundary** and **add-contextual-links** use variant matching so content with "Führungskräfteentwicklung" or "Fuehrungskraefteentwicklung" is detected
- **generate-blog-lexikon-mapping.php** uses `slugToSearchKeyword()` when falling back to slug, so mapping keys use umlaut form

See `docs/content/blog/guides/INTERNAL_LINKING_GUIDE.md` (German Umlaut and ASCII Handling).

## Related

- `.cursor/rules/blog-new-post-creation.mdc` – ASCII slug workflow
- `docs/development/CANONICAL_URLS_AND_LINKING.md` – Use canonical URLs in links
