Onderwerp ontbreekt: vul een topic in voor SEO-metadata (NL)
Inleiding: waarom dit onderwerp invullen essentieel is
De titel van deze tutorial is expres “kapot”: hij zegt niet waar het over gaat. In SEO-termen (maar ook voor documentatie, interne kennisbanken en AI-zoekfuncties) is dat funest. Een onderwerp (topic) is niet alleen een label; het bepaalt:
- Vindbaarheid (zoekmachines, interne search, chatbots)
- Context (waar gaat dit document precies over?)
- Indexeerbaarheid (welke keywords, entiteiten en synoniemen horen erbij?)
- Onderhoudbaarheid (wanneer je later iets terugzoekt of herstructureert)
In deze tutorial leer je hoe je een ontbrekend onderwerp systematisch invult en direct omzet naar SEO-metadata en een praktisch bruikbare documentstructuur. We doen dat niet met vage adviezen, maar met concrete stappen, echte commando’s en controleerbare output.
Doel: je eindigt met een herhaalbaar proces om van “Onderwerp ontbreekt” naar een scherp topic, een solide keywordset, een logische outline en meetbare checks.
Wat bedoelen we precies met “topic”?
Een topic is een afgebakend kennisgebied dat je in één pagina (of één cluster van pagina’s) behandelt. Het is breder dan een enkel keyword, maar smaller dan een complete categorie.
Voorbeelden (goed afgebakend):
- “Git rebase interactief gebruiken om commits op te schonen”
- “Docker Compose: multi-container development omgeving opzetten”
- “NGINX reverse proxy configureren met TLS via Let’s Encrypt”
Voorbeelden (te vaag):
- “Git”
- “Docker”
- “Servers”
Voorbeelden (te smal):
- “Wat is
git status?” - “Wat betekent HTTP 301?”
Een goed topic voldoet meestal aan:
- Intentie: welke vraag beantwoord je?
- Scope: wat valt er wel/niet onder?
- Doelgroep: voor wie is het (beginner/gevorderd, devops, marketing, etc.)?
- Actie: welke concrete taak kan iemand na afloop uitvoeren?
Stap 1 — Bepaal de zoekintentie (search intent)
SEO draait niet om “zoveel mogelijk keywords”, maar om de beste match met intentie. Grofweg zijn er vier intenties:
- Informational: “hoe werkt X?”, “wat is Y?”
- Navigational: “login pagina X”, “documentatie Y”
- Commercial investigation: “beste tool voor Z”, “X vs Y”
- Transactional: “koop”, “download”, “abonnement”
Voor tutorials is de intentie bijna altijd informational met een taakcomponent (“hoe doe ik dit?”).
Praktische oefening: formuleer 1 hoofdvraag
Schrijf één zin:
- “Ik wil leren hoe ik … zodat ik …”
Voorbeeld:
- “Ik wil leren hoe ik een reverse proxy met NGINX configureer zodat ik meerdere webapps achter één domein kan hosten.”
Zonder zo’n zin ga je bijna zeker te breed of te vaag schrijven.
Stap 2 — Kies een topic met juiste scope (topic framing)
Gebruik deze template om je topic scherp te maken:
- Werkwoord + object + context + constraint
- Bijvoorbeeld: “Configureren + NGINX reverse proxy + op Ubuntu 22.04 + met Let’s Encrypt TLS”
Je topic wordt dan:
- “NGINX reverse proxy op Ubuntu 22.04 configureren met Let’s Encrypt (TLS)”
Scope-afbakening (heel belangrijk)
Maak expliciet wat je niet doet. Bijvoorbeeld:
- Geen Kubernetes ingress
- Geen HA setup
- Geen Cloudflare-specifieke instellingen (of juist wel)
Dit voorkomt dat je tutorial uitwaaiert en onaf wordt.
Stap 3 — Verzamel keywords en synoniemen (zonder te gokken)
Je hoeft geen dure tools te gebruiken om een eerste set te maken. Je kunt al veel doen met:
- Google suggesties (handmatig)
- Interne zoeklogs (als je die hebt)
- Command line scraping van SERP features (beperkt, maar nuttig)
- Analyse van bestaande docs/pagina’s
3.1 Keywords brainstormen met een simpele lijst
Maak drie kolommen:
- Hoofdkeyword (1): exact waar de pagina over gaat
- Varianten (5–15): synoniemen, woordvolgorde, “how to” varianten
- Subtopics (5–15): onderdelen die je móét behandelen
Voorbeeld (NGINX reverse proxy):
- Hoofdkeyword:
nginx reverse proxy - Varianten:
nginx proxy_pass,reverse proxy nginx ubuntu,nginx meerdere sites,nginx ssl letsencrypt,nginx proxy headers - Subtopics: TLS, headers, websockets, systemd, firewall, test config, logs
3.2 Haal “People also ask”/suggesties op (semi-automatisch)
Volledig automatisch scrapen van Google is vaak tegen voorwaarden, maar je kunt wél op een nette manier suggesties verzamelen via alternatieven of door handmatig te kijken. Als je toch command line wilt gebruiken voor inspiratie, kun je Wikipedia/StackOverflow/Docs doorzoeken.
Voor lokale content (bijv. een docs-repo) kun je dit doen:
# Zoek in je repository naar relevante termen om bestaande teksten te hergebruiken
rg -n "reverse proxy|proxy_pass|letsencrypt|TLS" .
Of als je al een map met Markdown docs hebt:
# Toon de 20 meest voorkomende woorden (ruw) in docs
find docs -name "*.md" -print0 \
| xargs -0 cat \
| tr -cs '[:alnum:]' '\n' \
| tr '[:upper:]' '[:lower:]' \
| sort \
| uniq -c \
| sort -nr \
| head -n 20
Dit is geen perfecte NLP-analyse, maar het laat je snel zien welke termen in je eigen corpus dominant zijn.
Stap 4 — Maak SEO-metadata die klopt (en niet spammy is)
Wanneer het onderwerp ontbreekt, ontbreken meestal ook:
- Title tag (paginatitel)
- Meta description
- H1/H2-structuur
- Canonical/slug (in CMS)
- Interne link-ankers
4.1 Title tag (niet hetzelfde als H1, maar vaak wel)
Richtlijnen:
- 50–60 tekens is vaak veilig (geen harde regel)
- Begin met het hoofdtopic
- Voeg context toe (OS, tool, jaar) als het relevant is
- Vermijd keyword stuffing
Voorbeeld:
NGINX reverse proxy instellen op Ubuntu + Let’s Encrypt TLS
4.2 Meta description
Richtlijnen:
- 140–160 tekens als richtwaarde
- Beschrijf de uitkomst (“na dit artikel kun je…”)
- Noem 1–2 belangrijke termen (niet 10)
Voorbeeld:
Leer stap voor stap een NGINX reverse proxy op Ubuntu configureren, inclusief proxy_pass, headers en gratis TLS-certificaten met Let’s Encrypt.
4.3 URL/slug
Kort, leesbaar, met kernwoorden:
/nginx-reverse-proxy-ubuntu-letsencrypt/
Stap 5 — Bouw een tutorial-outline die “zoekintentie” afdekt
Een sterke tutorial heeft meestal:
- Intro + prerequisites
- Conceptuele uitleg (waarom/hoe werkt het)
- Stappenplan (commando’s, config, checks)
- Troubleshooting
- Beveiliging/best practices
- Volgende stappen
Outline-template (herbruikbaar)
- H1: het topic
- H2: Wat je gaat bouwen / leren
- H2: Vereisten
- H2: Concepten (korte theorie)
- H2: Installatie
- H2: Configuratie
- H2: Testen en valideren
- H2: Troubleshooting
- H2: Hardening / security
- H2: Conclusie + vervolg
Stap 6 — Voorbeeld: vul het ontbrekende onderwerp in (met echte commands)
Omdat de titel van dit document “Onderwerp ontbreekt” is, demonstreren we het proces met een concreet onderwerp. Stel dat jouw bedoeling was: een reverse proxy met NGINX op Ubuntu instellen.
6.1 Definitief topic
Topic: NGINX reverse proxy op Ubuntu 22.04 configureren met Let’s Encrypt TLS
Doelvraag:
“Hoe configureer ik NGINX als reverse proxy zodat ik meerdere services achter één domein kan publiceren, met HTTPS?”
Scope:
- Wel: NGINX, proxy_pass, headers, TLS via Certbot, systemd, firewall
- Niet: Kubernetes, HA/load balancing clusters, Cloudflare-specifieke setup
6.2 Prerequisites
- Ubuntu 22.04 server (of vergelijkbaar)
- Domeinnaam (bijv.
example.com) met DNS A/AAAA record naar je server - SSH-toegang met sudo
- Een backend service die luistert op
127.0.0.1:3000(bijv. Node/Go app)
Stap 7 — Implementatie: NGINX reverse proxy + TLS (stap voor stap)
7.1 Update je server
sudo apt update
sudo apt -y upgrade
7.2 Installeer NGINX
sudo apt -y install nginx
Controleer status:
systemctl status nginx --no-pager
Open eventueel de firewall (UFW):
sudo ufw allow 'Nginx Full'
sudo ufw status
7.3 Maak een NGINX server block (virtual host)
Maak een configbestand:
sudo nano /etc/nginx/sites-available/example.com
Plaats dit (pas domein en poort aan):
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
# Belangrijke headers voor reverse proxy
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Timeouts (optioneel, maar vaak nuttig)
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
Activeer de site:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Controleer de NGINX-config:
sudo nginx -t
Herlaad NGINX:
sudo systemctl reload nginx
7.4 Test of proxy werkt (zonder TLS)
Vanaf je laptop:
curl -I http://example.com
Je wilt een 200, 301 of in ieder geval een response zien die aantoont dat NGINX antwoordt. Als je backend draait, moet de content van je app zichtbaar zijn.
Veelvoorkomende fout: backend luistert niet op localhost
Check of je service luistert:
ss -tulpn | grep 3000
Als je app alleen op 0.0.0.0:3000 luistert is dat meestal ook oké, maar 127.0.0.1 is veiliger als NGINX op dezelfde machine zit.
Stap 8 — TLS toevoegen met Let’s Encrypt (Certbot)
8.1 Installeer Certbot + NGINX plugin
sudo apt -y install certbot python3-certbot-nginx
8.2 Vraag certificaten aan en laat NGINX aanpassen
sudo certbot --nginx -d example.com -d www.example.com
Certbot vraagt o.a.:
- akkoord met voorwaarden
- redirect HTTP→HTTPS (meestal: ja)
8.3 Controleer automatische renew
Test renew:
sudo certbot renew --dry-run
Bekijk timers:
systemctl list-timers | grep certbot
Stap 9 — Verdieping: waarom die proxy headers belangrijk zijn
Zonder headers ziet je backend vaak:
- verkeerde client-IP (alles lijkt van 127.0.0.1 te komen)
- verkeerde scheme (HTTP i.p.v. HTTPS)
- verkeerde host (handig bij multi-tenant apps)
Uitleg per header
Host: nodig voor routing op hostnaam in je appX-Real-IP: het “echte” client-IP (handig voor logging)X-Forwarded-For: chain van proxies; standaard voor veel frameworksX-Forwarded-Proto: laat je app weten of de client via HTTPS binnenkwam
Veel frameworks (Django, Express, Rails) hebben instellingen om “trusted proxies” te definiëren. Zonder die instellingen kan je app onveilige aannames doen (bijv. redirects of secure cookies).
Stap 10 — WebSockets en streaming (veelgemaakte valkuil)
Als je app WebSockets gebruikt (bijv. /socket), voeg dit toe:
location /socket/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Waarom? WebSockets vereisen een HTTP upgrade handshake. Zonder Upgrade/Connection faalt de verbinding of valt hij steeds weg.
Stap 11 — Troubleshooting met echte checks
11.1 NGINX config errors
sudo nginx -t
Bekijk logs:
sudo tail -n 200 /var/log/nginx/error.log
sudo tail -n 200 /var/log/nginx/access.log
Live volgen:
sudo tail -f /var/log/nginx/error.log
11.2 Certbot issues (DNS/HTTP challenge)
Controleer of DNS klopt:
dig +short A example.com
dig +short AAAA example.com
Controleer of poort 80 bereikbaar is (Let’s Encrypt HTTP-01 challenge):
sudo ss -tulpn | grep ':80'
11.3 502 Bad Gateway
Bijna altijd:
- backend down
- verkeerde
proxy_passhost/poort - firewall/SELinux (op Ubuntu meestal niet SELinux)
- app luistert alleen op een andere interface
Check backend:
curl -I http://127.0.0.1:3000
Als dit faalt, fix eerst je app/service.
Stap 12 — Security en best practices
12.1 Beperk direct verkeer naar backend
Laat je app alleen op localhost luisteren (indien mogelijk). Als je app op 0.0.0.0 moet luisteren, blokkeer dan extern verkeer met firewallregels.
Met UFW kun je bijvoorbeeld alleen 80/443 openzetten:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw deny 3000/tcp
sudo ufw status
12.2 Zet veilige TLS-instellingen (optioneel)
Certbot zet meestal goede defaults, maar je kunt NGINX verder hardenen. Controleer je TLS met:
curl -I https://example.com
En extern met een TLS test (handmatig via browser/online tool). In documentatie kun je beschrijven welke ciphers je nastreeft, maar ga niet blind “streng” instellen zonder compatibiliteit te checken.
12.3 Rate limiting (basis)
Voor simpele bescherming tegen brute force/abuse:
# In http {} context (bijv. /etc/nginx/nginx.conf)
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
En in je server block:
location / {
limit_req zone=req_limit_per_ip burst=20 nodelay;
proxy_pass http://127.0.0.1:3000;
# headers...
}
Stap 13 — SEO-checklist: van “onderwerp ontbreekt” naar publiceerbaar
Gebruik deze checklist voordat je publiceert:
- Topic is één zin en bevat werkwoord + object + context
- H1 matcht het topic (menselijk leesbaar)
- Title tag bevat hoofdkeyword + context (geen stuffing)
- Meta description beschrijft uitkomst + 1–2 kerntermen
- Outline dekt subtopics die bij intent horen
- Commando’s zijn testbaar en compleet (install, config, validate)
- Troubleshooting bevat minimaal 3 realistische fouten
- Interne links naar prerequisites en vervolg (bijv. “systemd service maken”, “firewall basics”)
- Afbeeldingen (optioneel) hebben alt-tekst met beschrijvende termen
- Laatste update (optioneel) vermeld als je content snel veroudert
Stap 14 — Maak het proces herhaalbaar (template)
Hier is een compacte template die je telkens kunt invullen:
Topic-definitie
- Topic:
- Doelvraag:
- Doelgroep:
- Prerequisites:
- Scope (wel):
- Scope (niet):
SEO-metadata
- Title tag:
- Meta description:
- Slug:
- Hoofdkeyword:
- Varianten:
- Subtopics:
Outline
- H1:
- H2:
- H2:
- H2:
Conclusie
Een ontbrekend onderwerp is niet alleen een “lege plek” in je titel; het is een signaal dat je document waarschijnlijk ook mist: intentie, scope, structuur en metadata. Door het topic te formuleren als een taakgerichte zin, keywords en subtopics te verzamelen, en daarna een outline te bouwen die de zoekintentie afdekt, maak je je tutorial tegelijk vindbaar en bruikbaar.
Als je wilt, kan ik op basis van jouw echte context (tool/stack/doelgroep) het ontbrekende topic invullen en vervolgens een volledige, consistente tutorialstructuur + SEO-metadata voorstellen. Geef dan: (1) doelgroep, (2) technologie/stack, (3) gewenste uitkomst, (4) wat er al bestaat (repo/notes).