✦ Oplossingen · DNS en domeinnaam

Website werkt niet zonder www (of juist niet met www)

Werkt je site alleen met of alleen zonder www? Meestal ontbreekt een DNS-record, dekt het certificaat niet beide namen of mist een redirect. Zo los je het op.

Zo ziet de foutmelding eruit

  • DNS_PROBE_FINISHED_NXDOMAIN
  • ERR_NAME_NOT_RESOLVED
  • NET::ERR_CERT_COMMON_NAME_INVALID
  • Your connection is not private
  • Uw verbinding is niet privé

Waarom gebeurt dit?

Voor DNS en de webserver zijn voorbeeld.nl en www.voorbeeld.nl twee verschillende namen. Elk moet een eigen DNS-record hebben, het certificaat moet beide namen dekken, en de webserver moet weten dat beide namen bij dezelfde site horen. Ontbreekt één van die drie, dan werkt de ene variant wel en de andere niet.

De oorzaken per variant: geeft de browser DNS_PROBE_FINISHED_NXDOMAIN of ERR_NAME_NOT_RESOLVED, dan ontbreekt het DNS-record voor die naam. Krijg je ‘Uw verbinding is niet privé’ met NET::ERR_CERT_COMMON_NAME_INVALID, dan staat de naam niet op het certificaat. Krijg je een standaardpagina van de webserver, een andere site of een 404, dan is de webserver niet voor die naam ingesteld.

Ook als beide varianten werken, is het verstandig er één te kiezen als voorkeur en de andere met een permanente doorverwijzing (301) daarheen te sturen. Dan staat je site maar onder één adres in zoekmachines, worden cookies en inlogsessies niet over twee namen verdeeld, en kom je niet op verschillende versies van je site uit.

Zo herken je dit probleem

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Test beide varianten, met http en https

    Open alle vier de adressen: http://voorbeeld.nl, http://www.voorbeeld.nl, https://voorbeeld.nl en https://www.voorbeeld.nl. Noteer wat er gebeurt: foutmelding, certificaatwaarschuwing, verkeerde site of doorverwijzing. Met curl -I zie je de statuscode en waar een doorverwijzing heen gaat.

    curl -I http://voorbeeld.nl
    curl -I http://www.voorbeeld.nl
    curl -I https://voorbeeld.nl
    curl -I https://www.voorbeeld.nl
  2. Controleer de DNS-records voor beide namen

    Beide namen moeten naar dezelfde webserver wijzen. Gebruikelijk is een A-record (en eventueel AAAA-record) op het hoofddomein en een CNAME van www naar het hoofddomein. Geeft een van beide geen antwoord, maak dat record dan aan. Een CNAME mag niet op het hoofddomein: zie CNAME-fout op het hoofddomein.

    dig voorbeeld.nl A +short
    dig voorbeeld.nl AAAA +short
    dig www.voorbeeld.nl +short
    dig www.voorbeeld.nl AAAA +short
  3. Zorg dat het certificaat beide namen dekt

    Kijk welke namen op het certificaat staan. Ontbreekt een variant, vraag dan een certificaat aan voor beide namen. Bij Let’s Encrypt met certbot geef je beide namen op; bij een hostingpaneel zet je bij het certificaat ook de www-variant aan. Het DNS-record voor beide namen moet al naar de server wijzen, anders lukt de controle niet.

    # welke namen staan op het certificaat?
    openssl s_client -connect voorbeeld.nl:443 -servername voorbeeld.nl </dev/null 2>/dev/null | openssl x509 -noout -ext subjectAltName
    
    # certificaat voor beide namen (nginx)
    sudo certbot --nginx -d voorbeeld.nl -d www.voorbeeld.nl
  4. Stel de webserver in voor beide namen

    De webserver moet beide namen herkennen. In nginx staan ze bij server_name, in Apache bij ServerName en ServerAlias. Ontbreekt een naam, dan valt de webserver terug op een standaardsite. In een hostingpaneel voeg je de andere variant toe als alias of als extra domein bij het pakket.

  5. Kies een voorkeursvariant en verwijs door met 301 (nginx)

    Kies of je site op www of zonder www draait en stuur alle andere varianten met een 301 naar dat adres. In nginx doe je dat met aparte serverblokken; het blok voor je voorkeursvariant bevat de echte site. Test met sudo nginx -t en herlaad daarna.

    server {
        listen 80;
        listen [::]:80;
        server_name voorbeeld.nl www.voorbeeld.nl;
        return 301 https://www.voorbeeld.nl$request_uri;
    }
    
    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name voorbeeld.nl;
        ssl_certificate     /etc/letsencrypt/live/voorbeeld.nl/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/voorbeeld.nl/privkey.pem;
        return 301 https://www.voorbeeld.nl$request_uri;
    }
    
    # daarna: server { listen 443 ssl; server_name www.voorbeeld.nl; ... de site ... }
  6. Of verwijs door met Apache (.htaccess)

    Bij Apache kun je de doorverwijzing in het .htaccess-bestand in de hoofdmap van je site zetten, mits mod_rewrite aan staat. Deze regels sturen alles wat niet op https://www.voorbeeld.nl binnenkomt daarheen. Wil je juist zonder www, draai de namen dan om. Een fout in .htaccess geeft een 500-fout: zie .htaccess-fout 500.

    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} !^www\.voorbeeld\.nl$ [NC]
    RewriteRule ^(.*)$ https://www.voorbeeld.nl/$1 [R=301,L]
  7. Controleer de keten en pas de site-instelling aan

    Test opnieuw alle vier de adressen met curl -I: elk moet in één stap met 301 op je voorkeursadres uitkomen, en dat adres moet 200 geven. Heeft je CMS een eigen instelling voor het site-adres, zet die dan op dezelfde voorkeursvariant; anders stuurt de site terug en ontstaat een lus. Werk ook de adressen in zoekmachine-tools en links bij.

    curl -sIL http://voorbeeld.nl | grep -iE '^(HTTP|location)'

Let op: Gebruik voor deze doorverwijzing pas een 301 als je zeker bent van de voorkeursvariant. Browsers onthouden een 301 lang; terugdraaien werkt voor eerdere bezoekers dan pas na het wissen van hun cache.

Wanneer schakel je hulp in?

  • Je weet niet waar je DNS, webserver of certificaat wordt beheerd.
  • Na het instellen van een doorverwijzing krijg je een redirect-lus en de site is onbereikbaar.
  • Het certificaat wil zich niet laten vernieuwen voor de tweede naam.
  • Je site draait op een extern platform en het hoofddomein moet daar zonder CNAME naartoe.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Is www.voorbeeld.nl een ander domein dan voorbeeld.nl?

Het is hetzelfde domein, maar een andere naam. Die naam heeft een eigen DNS-record nodig, moet op het certificaat staan en moet in de webserver zijn ingesteld.

Moet ik kiezen voor met of zonder www?

Allebei is prima. Belangrijk is dat je één variant kiest en de andere met een 301 daarheen stuurt.

Waarom krijg ik een certificaatfout op de variant zonder www?

Het certificaat is alleen voor de www-variant uitgegeven, of andersom. Vraag een certificaat aan dat beide namen dekt.

Is een doorverwijzing slecht voor mijn vindbaarheid?

Nee, een 301 naar je voorkeursvariant is juist gebruikelijk. Zo staat je site onder één adres in zoekmachines.