Eén van de meest populaire artikelen op Saotn.org is “How to redirect HTTP to HTTPS on IIS“. Want het is erg belangrijk om ervoor te zorgen dat jouw website goed redirect naar het beveiligde HTTPS-adres. Hier geef ik je meer tips en informatie over het doorsturen van HTTP naar HTTPS, op IIS én Apache (web.config versus .htaccess). Lees gauw verder!

Hoe redirect ik mijn website van HTTP naar HTTPS, op IIS én Apache? En waarom? Een SSL-certificaat op je website is toch wel de de facto-standaard tegenwoordig. De communicatie tussen de bezoeker en website is versleuteld, hierdoor kunnen derden dit niet onderscheppen en meelezen. Door het uitwisselen van cryptografische certificaten weet de bezoeker ook dat hij echt kijkt naar jouw website, en niet iemands kopie. Dat geeft vertrouwen. De privacy van de bezoeker is door het versleutelen en vertrouwen gewaarborgd.

Maar hoe zorg je er nu voor dat jouw website goed ingesteld staat op HTTPS nadat je een SSL-certificaat hebt laten installeren? Ik leg het je graag uit. Wel moet je eerst weten dat er verschillende “merken” webserver zijn. Enkele bekende webservers zijn Internet Information Services (IIS) van Microsoft, Apache, Nginx en LiteSpeed.

Ik beperk me hier tot IIS en Apache, omdat dat is wat we bij Vevida aanbieden.

Wist je dat je veel van deze informatie ook vind in mijn artikel SSL in WordPress: how to move WordPress to HTTPS? The definitive guide op Saotn.org?

Redirect best practices

Er zijn best practices voor het redirecten van URL’s. Eén zo’n best practice is: een site die bereikbaar is op poort 80 (http) moet alleen redirecten naar dezelfde resource op https.

Schematisch ziet dat er zo uit:

http://example.nl > 301 > https://example.nl
https://example.nl > 301 > https://www.example.nl
http://www.example.nl > 301 > https://www.example.nl

Hiermee wordt iedere bron die op HTTP bereikbaar is alleen doorgestuurd naar dezelfde bron op HTTPS.

Een tweede best practice is om te redirecten in plaats van te herschrijven (Redirect vs RewriteRule) in .htaccess, maar ook in web.config.

An HTTP to HTTPS redirect on IIS is often better left to the web server, with a simple httpRedirect redirection, than to a resource expensive URL Rewrite.

How to redirect HTTP to HTTPS on IIS

Later meer over een redirect naar HTTPS in Apache .htaccess. Een IIS web.config equivalent vind je in het gequote artikel.

Zoals ik al eerder aangaf geef ik voorbeelden voor twee webservers: IIS en Apache. Waarbij IIS een web.config-configuratiebestand gebruikt en Apache .htaccess.

Wil je graag leren hoe je jouw WordPress, Drupal, Joomla of Umbraco website doorstuurt van HTTP naar HTTPS? Lees gauw verder!

IIS redirect van HTTP naar HTTPS in web.config met de URL Rewrite Module

Om in IIS een website te redirecten van HTTP naar HTTPS moet je gebruikmaken van de URL Rewrite Module in combinatie met een web.config-configuratiebestand. Hierin neem je het volgende op:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="itfaq.nl domein naar niet-www https" patternSyntax="ECMAScript" stopProcessing="true">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTPS}" pattern="off" />
<add input="{HTTP_HOST}" pattern="^itfaq\.nl$" />
<add input="{URL}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="https://itfaq.nl/{R:1}" redirectType="Permanent" />
</rule>
<rule name="itfaq.nl https niet-www naar www https" patternSyntax="ECMAScript" stopProcessing="true">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTPS}" pattern="on" />
<add input="{HTTP_HOST}" pattern="^itfaq\.nl$" />
<add input="{URL}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="https://www.itfaq.nl/{R:1}" redirectType="Permanent" />
</rule>
<rule name="www.itfaq.nl http naar https" patternSyntax="ECMAScript" stopProcessing="true">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTPS}" pattern="off" />
<add input="{HTTP_HOST}" pattern="^www\.itfaq\.nl$" />
<add input="{URL}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="https://www.itfaq.nl/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

Sla dit op in een bestand genaamd web.config en upload het via FTP naar de physical content directory (webroot). Bij Vevida is dat ‘www’.

Als je slechts één enkele URL Rewrite regel wilt maken om alle requests door te sturen naar HTTPS, gebruik dan deze one rule to rule them all:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)"/>
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true"/>
</conditions>
<action type="Redirect" url="https://{SERVER_NAME}/{R:1}" redirectType="Permanent"/>
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

In plaats van al dit web.config-geweld kun je ook jouw systeembeheerder vragen HSTS-reactieheaders te configureren, met daarin een automatische redirect naar HTTPS.

Een HTTP naar HTTPS redirect in Apache .htaccess

Als je op Linux Apache webservers een redirect van http naar https wilt instellen, dan kan dit in de z.g vhost configuratie. Maar omdat de vhost configuratie alleen beschikbaar is voor beheerders, kun je ook gebruikmaken van mod_rewrite in een .htaccess-bestand.

Een nadeel hiervan is dat je een RewriteRule gebruikt.

Neem in het .htaccess bestand het volgende op om je website van HTTP naar HTTPS te redirecten:

RewriteEngine On

# ITFAQ.nl niet www naar https niet www,
# http://itfaq.nl naar https://itfaq.nl
RewriteCond %{HTTP_HOST} ^itfaq\.nl$ [NC]
RewriteCond %{HTTPS} off [NC]
RewriteCond %{REQUEST_URI} (.+) [NC]
RewriteRule (.*) https://itfaq.nl/$1 [NC,R=301,L,QSA]

# ITFAQ.nl www naar https www,
# http://www.itfaq.nl naar https://www.itfaq.nl
RewriteCond %{HTTP_HOST} ^www\.itfaq\.nl$ [NC]
RewriteCond %{HTTPS} off [NC]
RewriteCond %{REQUEST_URI} (.+) [NC]
RewriteRule (.*) https://www.itfaq.nl/$1 [NC,R=301,L,QSA]

# ITFAQ.nl non-www https naar www HTTPS,
# https://itfaq.nl naar https://www.itfaq.nl
RewriteCond %{HTTP_HOST} ^itfaq\.nl$ [NC]
RewriteCond %{HTTPS} on [NC]
RewriteCond %{REQUEST_URI} (.+) [NC]
RewriteRule (.*) https://www.itfaq.nl/$1 [NC,R=301,L,QSA]

Vergeet niet om in dit voorbeeld “itfaq.nl” te vervangen door jouw eigen domeinaam. Anders krijg ik heel veel extra bezoekers ;-).

De one rule to rule them all variant voor .htaccess is:

RewriteEngine On
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]

Over .htaccess gesproken, ik kom helaas heel veel foutieve voorbeelden in blogposts tegen om je website te beveiligen met .htaccess bestanden. Als je mijn Saotn.org artikel WordPress .htaccess security best practices in Apache 2.4.6+ doorleest weet je precies waar je op moet letten als je weer zo’n blogpost of artikel tegenkomt.

Update: Redirect in plaats van RewriteRule

In een kleine Twitter-conversatie met Rutger, noemt hij dat het toch mogelijk moet zijn een Redirect te gebruiken zònder VirtualHost configuratie in Apache.

https://twitter.com/rvansleen/status/1177536841337245696

Na een kort onderzoekje en test aan de hand van zijn niet geteste alternatief, vond ik dat het volgende prima lijkt te werken:

<If "%{HTTPS} != 'on'">
 Redirect permanent "/" "https://www.itfaq.nl/"
</If>

HTTP Strict Transport Security (HSTS)

Met HSTS (HTTP Strict Transport Security) stel je in dat een client, zoals een browser, in alle communicatie met een website altijd gebruik moet maken van een HTTPS-verbinding. Door HSTS te activeren onthoudt de browser de verbinding met de website versleuteld moet zijn en niet moet proberen een onversleutelde HTTP-connectie te maken. Deze maatregel voorkomt zogenaamde protocol downgrade-attacks en cookie hijacking.

Je stelt een “Strict-Transport-Security” beleid eenvoudig in met een HSTS-reactieheader.

HSTS maakt onderscheid in domeinen en subdomeinen; www.itfaq.nl wordt alleen meegenomen als je includeSubdomains gebruikt.

HSTS instellen in IIS

Een administrator kan in IIS Manager het gebruik van HTTP Strict Transport Security (HSTS) instellen. In Windows Server 2019 met IIS 10.0 is hiervoor een HSTS-instelling bijgekomen, aan de rechterkant in de Actions pane. Als je een gewone gebruiker bent dan moet je even met jouw provider contact opnemen om dit in te stellen, want als gewone gebruiker mag je dit niet zelf.

Wél kun je de ouderwetse outboundRule in het web.config-bestand gebruiken. Op Saotn.org vind je hiervoor mijn artikel How to enable HTTP Strict-Transport-Security (HSTS) on IIS met een eenvoudig voorbeeld.

Ben je zelf de systeembeheerder? De drie stappen om in IIS Manager HSTS in te stellen zijn:

HSTS instellen in Internet Information Services (IIS), afb 01
HSTS instellen in Internet Information Services (IIS), afb 01
HSTS instellen in Internet Information Services (IIS), afb 02
HSTS instellen in Internet Information Services (IIS), afb 02
HSTS instellen in Internet Information Services (IIS), afb 03
HSTS instellen in Internet Information Services (IIS), afb 03

Dit zorgt ervoor dat in het applicationHost.config bestand bij de site wordt opgenomen:

<hsts enabled="true" max-age="31536000" includeSubDomains="true" preload="true" redirectHttpToHttps="true" />

Uiteraard kun je ervoor kiezen om niet includeSubDomains erin op te nemen, preload of redirectHttpToHttps. Of je de redirect van http naar https wilt instellen is er ook afhankelijk van of je de bovengenoemde URL Rewrite Module regel gebruikt.

Wat is een subdomein ook alweer? Je leest hier wat een subdomein is.

HSTS instellen in Apache

Om HSTS in te stellen in Apache, neem dan de volgende Header directive op in je .htaccess:

Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

Als je problemen hebt met het instellen van deze rewrites en redirects, laat dan een reactie achter en wellicht kan ik – of een andere bezoeker – jou helpen.

Leave a Comment

Comments

No comments yet. Why don’t you start the discussion?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *